給出乙個有n個元素的陣列s,s中是否有元素a,b,c和d滿足a+b+c+d=目標值?找出陣列s中所有滿足條件的四元組。
注意:四元組(a、b、c、d)中的元素必須按非降序排列。(即a≤b≤c≤d)
解集中不能包含重複的四元組。
例如:給出的陣列 s = , 目標值 = 0.↵↵ 給出的解集應該是:↵ (-1, 0, 0, 1)↵ (-2, -1, 1, 2)↵ (-2, 0, 0, 2)
和前邊刷到的3sum closed類似題目,不知道的可以看上篇。都是通過指標移動的方法來降低迴圈的層數,然後對要求的元素進行組合。
需要通過四指針對所有進行組合,兩個指標移動控制外層迴圈,begin,end進行收縮,通過此方法獲取所有元素的組合。
對所獲取的元素進行去重,如果在結果中進行去重,需要進行雙層遍歷list不太現實(此時想到通過對list的tostring方法獲取字串進行去重,當然也是一件很麻煩的事),最好的辦法就是列舉出所有重複的場景迴圈的時候進行去重。
public
static arraylist
>
foursum
(int
num,
int target)
//向右移動,注意此時沒有j++
for(
int j=i+
1;j)//第三次去重,將end重複去掉
while
(begin < end && num[end +1]
== num[end])}
}//這裡就是體現我無知的地方了,
//提出疑問為什麼不在for中進行j++?另一篇部落格解釋,看底部連線
j++;//第四次去重,將重複的j值去掉
while
(j < num.length -
2&& num[j]
== num[j -1]
)}}return lists;
}
此題目的關鍵就是去重,去除重複的 i,去除重複的 j,去除重複的 begin,end區別i++在迴圈體中和i++在迴圈條件中的作用
leetcode刷題 劍指offer 24題
輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有奇數在陣列的前半部分,所有偶數在陣列的後半部分。示例 輸入 nums 1,2,3,4 輸出 1,3,2,4 注 3,1,2,4 也是正確的答案之一。新手上路,才學疏淺,望斧正 class solution int m 0,n len 1...
劍指offer刷題
面試題6 從尾到頭列印鍊錶 struct listnode class solution reverse res.begin res.end return res 替換空格class solution int newnumstr numstr numspace 2 if newnumstr leng...
劍指offer刷題
原題鏈結 動態規劃 class solution dp for int i 1 i len1 i else if p j 1 else return dp len1 len2 原題鏈結 數學推導 找規律 class solution else if n 3 2 return ipow 3 numso...