LeetCode-遍历技巧

Posted nomad1c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-遍历技巧相关的知识,希望对你有一定的参考价值。

1. Two Sum 两数之和

https://leetcode.com/problems/two-sum/

题目:给定一个整数数组,返回这两个数字的索引,这两个数字的和为target。假设每个输入都有一个解决方案,并且不能使用相同的元素两次。

思路:将nums中的所有元素和对应索引放到HashMap中,从nums的第一个数开始循环,判HashMap中是否存在t = target - nums[i],即判断HashMap中是否存在目标target与当前索引指向的数之差,存在则将当前索引和HashMap中查得的索引存入数组中,最后返回数组。注意要判断查找到的数字不是第一个数字,比如target是4,遍历到了一个2,那么另外一个2不能是之前那个2。

 

11. Container With Most Water 装水最多的容器

https://leetcode.com/problems/container-with-most-water/

题目:给定n个非负整数a1,a2,...,an,其中每一个整数表示坐标轴中的一个点(i,ai)。绘制n条垂直线,使第 i 行的两个端点位于(i,ai)和(i,0)处。找出两条线,与x轴一起形成一个容器,使得容器中的水最多。

思路:最简单的方法是单向遍历所以可能的结果,但这样消耗的时间太多。可以取左右两个端点left和right来进行遍历,在每次循环开始计算容器装水量的最大值maxWater,接着判断左端点和右端点的高度,若右边更高,则left自增,否则right自减,继续进行循环直到不满足left<right,最后返回maxWater。

 

15. 3Sum 三数之和

https://leetcode.com/problems/3sum/

题目:给定有n个整数的数组nums,该数组中是否存在元素a、b、c满足a+b+c=0?在数组中找出所有满足条件的唯一的三个数。

思路:

①判断nums是否为空,在进行循环前对nums进行排序,记n为nums最后一项的索引;

②开始循环,针对三个数a、b、c,我们定a的索引 i 为0,b的索引 j 为 i+1,c的索引 k 为 n-1;

③开始第二层循环,在保证 j 小于 k 的情况下,判断三数之和(sum)是否等于0,sum == 0则将结果添加到HashSet中,sum < 0则令 j 自增,sum > 0则 k 自减,如此一直进行判断,直到不满足条件;

④在第二层循环结束后令 i 自增,继续第一层循环,i要满足小于 n-2。

 

16. 3Sum Closest 最接近的三数之和

https://leetcode.com/problems/3sum-closest/

题目:给定有n个整数的数组nums和一个整数目标,在num中找到三个整数,使和最接近目标。返回三个整数的和。假设每个输入都有一个解决方案。

思路:类似于三数之和的问题,使用3个指针来指向当前元素、下一个元素和最后一个元素。如果和小于目标,这意味着我们必须添加一个较大的元素,以便下一个元素移动到下一个元素。如果和较大,这意味着我们必须添加一个较小的元素,所以最后一个元素移动到第二个最后一个元素。一直做到最后。每次比较和与目标的差,如果到目前为止它小于最小差,则用它替换结果,否则继续迭代。

 

18. 4Sum 四数之和

https://leetcode.com/problems/4sum/

题目:给定要n个整数的数组nums和一个整数目标,那么nums中是否有元素a、b、c和d,使得a+b+c+d=目标值?在给出目标和的数组中找到所有唯一的四个数。

思路:思路跟三数之和(3Sum)基本一样,就是多加了一层 for 循环。还可以将四个数转换为两个数来处理。

 

 73. Set Matrix Zeroes 给矩阵赋零

https://leetcode.com/problems/set-matrix-zeroes/

题目:给定一个m x n矩阵,如果一个元素为0,则将其整个行和列设置为0。在矩阵内部改变。

思路:

① O(mn) :新建一个矩阵,大小和matrix相等,然后遍历每一行并进行赋值,遇到 0 就将新建矩阵对应的行全赋为 0,接着再遍历每一列,最后把新建的矩阵赋值给matrix。

② O(m + n) :用一个长度为m的一维数组记录各行中是否有 0,用一个长度为n的一维数组记录各列中是否有0,最后直接更新matrix数组。

③ O(1) :

  使用第一行和第一列来记录每一行和每一列中是否要 0。

  检查第一行和第一列是否有 0,并设置变量rowHasZero和ColumnHasZero。

  迭代矩阵的其余部分,当A[ i ][ j ]中有零时,将A[ i ][ 0 ]和A[ 0 ][ j ]设为 0。

  迭代矩阵的其余部分,如果A[ i ][ 0 ]中有 0,则将行 i 全部设为0。迭代矩阵的其余部分,如果A[ 0 ][ j ]中有 0,则对列 j 全部设为 0。

以上是关于LeetCode-遍历技巧的主要内容,如果未能解决你的问题,请参考以下文章

leetcode二叉树简单题技巧总结

LeetCode经典题分类(树&图 )精选 - JavaScript - ES6 - 技巧总结

leetcode中的python技巧

leetcode中的python技巧

leetcode中的python技巧

LeetCode54 螺旋矩阵,题目不重要,重要的是这个技巧