标签:个数 lis || new 方法 style discus -- 好的
开始的思路是,暴力解法,寻找每组的两个数O(N^2),然后找是否有第三个数,一共O(N^3)。
沿着这个思路,怎么降低复杂度呢?
开始的思路是,先排序,两个指针分别从两头往中间走,找第三个数,但是比如-3 -2 -1 -1 1 1 2 3,这个就无法判断下一个是应该左指针走还是右指针走,要递归了。
然后看discuss,55ms,66%的方法,是对每个数,找另外两个数,时间复杂度O(n^2)。
class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> ans = new ArrayList<>(); Arrays.sort(nums); for(int i=0;i<nums.length-2;i++) { if(i==0||(i>0&&nums[i]!=nums[i-1])) { int low=i+1,high=nums.length-1; while(low<high) { if(nums[low]+nums[high]==-nums[i]) { ans.add(Arrays.asList(nums[i],nums[low],nums[high])); while(low<high&&nums[low]==nums[low+1]) low++; while(low<high&&nums[high]==nums[high-1]) high--; low++;high--; } else if (nums[low]+nums[high]>-nums[i]) { high--; } else { low++; } } } } return ans; } }
这题挺好的。这个做法就可以了。
标签:个数 lis || new 方法 style discus -- 好的
原文地址:https://www.cnblogs.com/chason95/p/10017604.html