余杭网站建设,开发一个非常简单的聊天软件,wordpress添加顶部导航条,开网店不会做#xff0c;参考了代码随想录和力扣官方题解#xff0c;对此题进行整理。 代码思路
思想#xff1a;利用双指针法#xff0c;对数组从小到大排序。先固定一个数#xff0c;找到其他两个。
#xff08;1#xff09;首先对数组从小到大排序。 #xff08;2… 不会做参考了代码随想录和力扣官方题解对此题进行整理。 代码思路
思想利用双指针法对数组从小到大排序。先固定一个数找到其他两个。
1首先对数组从小到大排序。 2a从左到右遍历数组每一次遍历的时候设置left指针right指针。num[a]num[left]num[right]如果值等于0相当于找到了目标元组。如果值大于0right–如果值小于0left。
3涉及到去重的问题。a、left、right都会重复具体请看下图↑指a -指left 指right。 a去重如果在这次循环之前已经判断了三元组之一的元素num[a]不管是符合条件还是不符合条件已经判断过这个元素都跳过。if (num[a] num[a-1]) continue; 为什么这里不用num[a]和num[a1]比较因为会出现元组 -1 -1 2。这是符合条件的。num[a] 和num[a-1]保证的是在本次循环之前已经判断过这个元素num[a]和num[a1]比较还continue的话就是不允许三元组里有重复的元素。
left去重、right去重找到一个目标元组之后且上一步a去重现在要对left、right去重。如果num[left1] num[left], left如果num[right-1] num[right], right–。
4技巧三个数num[a]、num[left]、num[right]相加等于零因为初始值 lefta1,rightnum.length-1所以aleftright这个等式恒成立。又因为num数组从小到大排序三个数中最小的是a如果a0那么一定不存在这个元组。
20240103重写 20240103第一次重写错了很多对着答案改。 语言是 java。 class Solution {public ListListInteger threeSum(int[] nums) {// 不知道怎么初始化ListListInteger ans new ArrayListArrayListInteger();ListListInteger ans new ArrayList();Arrays.sort(nums);//写错了Arrays.sort()我写少了一个sint left,right;for(int i 0; i nums.length; i) {if(nums[i] 0) {return ans;}if(i0 nums[i]nums[i-1]) { //是i0不是i1continue;}left i1;right nums.length-1;while(left right) {int sum nums[i] nums[left] nums[right];if(sum 0) {right--;} else if(sum 0) {left;} else {ans.add(Arrays.asList(nums[i], nums[left], nums[right]));//不会写while(right left nums[left1] nums[left]) {left;}//为什么要设置right leftwhile(right left nums[right-1] nums[right]) {right--;}//漏写了。right--; left;}}}return ans;}
}错误1 错误2