18. 四数之和
Java回溯版(超时)
package leetcode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class demo_18 { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> list=new ArrayList<List<Integer>>(); Arrays.sort(nums); long sum=0; backtrack(list, new ArrayList<Integer>(), sum, target, nums, 0); System.out.println(list); return list; } public void backtrack(List<List<Integer>> list,List<Integer> alist,long sum,int target,int nums[],int j) { if(sum==target&&alist.size()==4) { list.add(new ArrayList<Integer>(alist)); } else { for(int i=j;i<nums.length;i++) { if(i>j&&nums[i]==nums[i-1]) {continue;} j=i; if(alist.size()<4) { sum=sum+nums[i]; alist.add(nums[i]); backtrack(list, alist, sum, target, nums, j+1); alist.remove(alist.size()-1); sum=sum-nums[i]; } else { break; } } } } public static void main(String[] args) { // TODO Auto-generated method stub demo_18 d18=new demo_18(); int nums[]= {1,0,-1,0,-2,2,0,0,0}; d18.fourSum(nums, 0); } }
CPP双指针
#include <vector> #include <algorithm> #include <iostream> using namespace std; class Solution { public: Solution(){} ~Solution(){} vector<vector<int>> fourSum(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); int len=nums.size(); int left; int right; long sum=0; auto res=vector<vector<int>>(); auto v=vector<int>(); int i; int j; for (i = 0; i < len; i++) { //去除重复 if(i>0&&nums[i]==nums[i-1]){continue;} for ( j = i+1; j < len; j++) { //去除重复 if(j>i+1&&nums[j]==nums[j-1]){continue;} //左右指针 left=j+1; right=len-1; while (left<right) { sum=(long)nums[i]+nums[j]+nums[left]+nums[right]; if (target==sum) { v.push_back(nums[i]); v.push_back(nums[j]); v.push_back(nums[left]); v.push_back(nums[right]); res.push_back(v); } if (target>sum) { left=left+1; //去除重复 while (left<right&&nums[left]==nums[left-1]) { left=left+1; } }else{ right=right-1; //去除重复 while (left<right&&nums[right]==nums[right+1]) { right=right-1; } } //更新vector if (v.size()==4) { for (int m = 0; m < 4; m++) { v.pop_back(); } left=left+1; } } } } return res; } }; int main(){ Solution s; auto res=vector<vector<int>>(); auto nums=vector<int>{1,0,-1,0,-2,2}; res=s.fourSum(nums,0); int len=res.size(); for (int i = 0; i < len; i++) { auto v=res[i]; for (int j = 0; j < 4; j++) { cout<<v[j]<<" "; } cout<<"\n"; } return 0; }
浙公网安备 33010602011771号