复杂度
T
(
N
)
=
O
(
N
)
,
M
(
N
)
=
O
(
N
)
T(N)=O(N),M(N)=O(N)
T(N)=O(N),M(N)=O(N)
结果 Runtime: 5 ms, faster than 70.02% of Java online submissions for Two Sum. Memory Usage: 37.5 MB, less than 100.00% of Java online submissions for Two Sum. 即(5ms, 70.02%, 37.5MB, 100.0%)
复杂度 思路1
T
(
N
)
=
O
(
N
2
)
,
M
(
N
)
=
O
(
N
)
T(N)=O(N^2),M(N)=O(N)
T(N)=O(N2),M(N)=O(N) 思路2
T
(
N
)
=
O
(
N
2
)
,
M
(
N
)
=
O
(
1
)
T(N)=O(N^2),M(N)=O(1)
T(N)=O(N2),M(N)=O(1) 且考虑到思路2变成复杂度更低。毫无疑问选思路2.
结果 (37ms, 99.61%, 48.5MB, 100.00%)
源码
classSolution{public List<List<Integer>>threeSum(int[] nums){int target =0;
List<List<Integer>> ans =newArrayList<List<Integer>>();
Arrays.sort(nums);int len = nums.length;for(int i =0; i+3<= len;++i){if(nums[i]*3> target)break;if(i >0&& nums[i]== nums[i-1])continue;int part_target = target-nums[i];int range[]={i+1,len-1};while(range[0]< range[1]){twoSum(nums,part_target,range);if(range[0]>= range[1])break;// found a ans
List<Integer> l =newArrayList<Integer>();
l.add(nums[i]);
l.add(nums[range[0]]);
l.add(nums[range[1]]);
ans.add(l);// movedo{++range[0];}while(range[0]< range[1]&& nums[range[0]]== nums[range[0]-1]);}}return ans;}publicvoidtwoSum(int[] nums,int target,int[]range){int t;while(range[0]< range[1]){
t = nums[range[0]]+nums[range[1]];if(t < target)++range[0];elseif(t > target)--range[1];elsereturn;}}}
4Sum
题意 类似于3Sum.只是变成4个数了。并且目标和不是固定的0,而是通过输入参数指定。
思路 直接循环枚举,注意控制条件以免重复。 其实应该写搜索的,但是枚举更加无脑暴力,就直接敲了。
复杂度
T
(
N
)
=
O
(
N
3
)
,
M
(
N
)
=
O
(
1
)
T(N)=O(N^3),M(N)=O(1)
T(N)=O(N3),M(N)=O(1)
结果 (19ms, 89.95%, 40MB, 100.00%)
源码
classSolution{public List<List<Integer>>fourSum(int[] nums,int target){
List<List<Integer>> ans =newArrayList<List<Integer>>();
Arrays.sort(nums);int len = nums.length;for(int i =0; i+4<= len;++i){if(nums[i]*4> target)break;if(i >0&& nums[i]== nums[i-1])continue;for(int j = i+1; j+3<= len;++j){if(nums[i]+nums[j]*3> target)break;if(j > i+1&& nums[j]== nums[j-1])continue;// 前一个数并非是a,[j]和前一个数相同,则没必要用[j]再当bint part_target = target-nums[i]-nums[j];int range[]={j+1,len-1};while(range[0]< range[1]){twoSum(nums,part_target,range);if(range[0]>= range[1])break;// found a ans
List<Integer> l =newArrayList<Integer>();
l.add(nums[i]);
l.add(nums[j]);
l.add(nums[range[0]]);
l.add(nums[range[1]]);
ans.add(l);// movedo{++range[0];}while(range[0]< range[1]&& nums[range[0]]== nums[range[0]-1]);}}}return ans;}publicvoidtwoSum(int[] nums,int target,int[]range){int t;while(range[0]< range[1]){
t = nums[range[0]]+nums[range[1]];if(t < target)++range[0];elseif(t > target)--range[1];elsereturn;}}}