現(xiàn)在哪些網(wǎng)站自己做裝修百度關(guān)鍵詞排名突然沒(méi)了
目錄
1、題目
2、思路
3、代碼
4、總結(jié)
1、題目
給你一個(gè)由?n
?個(gè)整數(shù)組成的數(shù)組?nums
?,和一個(gè)目標(biāo)值?target
?。請(qǐng)你找出并返回滿足下述全部條件且不重復(fù)的四元組?[nums[a], nums[b], nums[c], nums[d]]
?(若兩個(gè)四元組元素一一對(duì)應(yīng),則認(rèn)為兩個(gè)四元組重復(fù)):
0 <= a, b, c, d?< n
a
、b
、c
?和?d
?互不相同nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按?任意順序?返回答案 。
示例 1:
輸入:nums = [1,0,-1,0,-2,2], target = 0 輸出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
輸入:nums = [2,2,2,2,2], target = 8 輸出:[[2,2,2,2]]
2、思路
1、對(duì)數(shù)組進(jìn)行正序排序,可以防止結(jié)果重復(fù) 2、循環(huán)遍歷數(shù)組,退化成求2數(shù)之和, 循環(huán)指數(shù)i,i從0開(kāi)始,注意:需要判斷nums[i-1]==nums[i],避免重復(fù)結(jié)果 3、使用雙指著, 左指針j=i+1, 右指針q=nums.length - 1,(1)如果nums[i]+nums[j]+nums[q]>sum, 右指針左移(2)如果nums[i]+nums[j]+nums[q]==sum, 左指針右移,符合結(jié)果的數(shù)據(jù)(3)如果nums[i]+nums[j]+nums[q]<sum, 左指針右移注意:1、要判斷nums[i-1]==nums[i]2、需要判斷j,q的邊界值,免得越界
3、代碼
public static List<List<Integer>> threeSum1(int[] nums) {List<List<Integer>> resultList = new ArrayList<>();if (nums == null || nums.length < 3) {return resultList;}//排序Arrays.sort(nums);for (int i = 0; i < nums.length && nums[i] <= 0; i++) {//判斷是否重復(fù)if (i >= 1 && nums[i] == nums[i - 1]) {continue;}//2數(shù)之和int xx = 0 - nums[i];//左指針int j = i + 1;//右指針int q = nums.length - 1;//雙指針while (j < q && q >= 0) {//判斷是否重復(fù)if (j > i + 1 && nums[j] == nums[j - 1]) {j++;continue;}if (nums[j] + nums[q] == xx) {List<Integer> pathList = new ArrayList<>();pathList.add(nums[i]);pathList.add(nums[j]);pathList.add(nums[q]);resultList.add(pathList);j++;} else {if (nums[j] + nums[q] > xx) {//移動(dòng)右指針q--;} else {//移動(dòng)左指針j++;}}}}return resultList; }
4、總結(jié)
1、2數(shù)之和,可以直接用這個(gè)思路
2、4數(shù)之和,可以先簡(jiǎn)化成求3數(shù)之和,思路和這個(gè)類似
3、一定要注意先做排序,以及遍歷循環(huán),要判斷nums[i]==nums[i-1],重復(fù)就跳過(guò),免得結(jié)果重復(fù)