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-遍历技巧的主要内容,如果未能解决你的问题,请参考以下文章