Leetcode--923. 三数之和的多种可能
給定一個整數數組?A,以及一個整數?target?作為目標值,返回滿足 i < j < k 且?A[i] + A[j] + A[k] == target?的元組?i, j, k?的數量。
由于結果會非常大,請返回 結果除以 10^9 + 7 的余數。
?
示例 1:
輸入:A = [1,1,2,2,3,3,4,4,5,5], target = 8
輸出:20
解釋:
按值枚舉(A[i],A[j],A[k]):
(1, 2, 5) 出現 8 次;
(1, 3, 4) 出現 8 次;
(2, 2, 4) 出現 2 次;
(2, 3, 3) 出現 2 次。
示例 2:
輸入:A = [1,1,2,2,2,2], target = 5
輸出:12
解釋:
A[i] = 1,A[j] = A[k] = 2 出現 12 次:
我們從 [1,1] 中選擇一個 1,有 2 種情況,
從 [2,2,2,2] 中選出兩個 2,有 6 種情況。
思路:三指針法
特殊之處在于相同數字也算不同的個數,所以每次需要判斷有沒有相同組成的數組之和也等于target
情況一:nums[start]與nums[end]不一樣,例如示例一,1,2,5時,i=0時,通過判斷,2出現2次,5出現2次,所以2*2=4次
情況二:nums[start]與nums[end]一樣,例如示例二,1,2,2時,i=0時,后面4個2,選擇兩個即可,所以是4*3/2=6種
提示:
3 <= A.length <= 3000
0 <= A[i] <= 100
0 <= target <= 300
提交的代碼:
class?Solution?{
????public?int?threeSumMulti(int[]?nums,?int?target)?{
?????????Arrays.sort(nums);
???????int?i,start=1,end=nums.length-1,sum=0,a,b,c,t;
???????for(i=0;i<nums.length-2;i++)
???????{
???????????a=0;
???????????b=0;
???????????c=0;
???????????start=i+1;
???????????end=nums.length-1;
???????????while(start<end)
???????????{
????????????????a=0;
???????????????b=0;
???????????????c=0;
???????????????if(nums[i]+nums[start]+nums[end]>target)
???????????????{
???????????????????end--;
???????????????}
???????????????else?if(nums[i]+nums[start]+nums[end]<target)
???????????????{
???????????????????start++;
???????????????}
???????????????else
???????????????{
???????????????????while(nums[start]==nums[start+1]&&start+1!=end)
???????????????????{
???????????????????????if(nums[start]==nums[end])
???????????????????????{
???????????????????????????c++;
???????????????????????}
???????????????????????start++;
???????????????????????a++;
??????????????????????
???????????????????}
???????????????????while(nums[end]==nums[end-1]&&end-1!=start)
???????????????????{
???????????????????????end--;
???????????????????????b++;
???????????????????????
???????????????????}
???????????????????if(a==0&&b==0)
???????????????????{
???????????????????????sum++;
???????????????????}
???????????????????else{
???????????????????????if(nums[start]!=nums[end])
???????????????????????{
???????????????????????????sum=?sum+(a+1)*(b+1);
???????????????????????}
???????????????????????else
???????????????????????{
???????????????????????????c+=2;
???????????????????????????t?=?c*(c-1)/2;
???????????????????????????sum+=t;
???????????????????????}
???????????????????}
???????????????????sum=sum%1000000007;
???????????????????start++;
???????????????????end--;
???????????????}
???????????}
???????}
???????return?sum;
????}
}
總結
以上是生活随笔為你收集整理的Leetcode--923. 三数之和的多种可能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【剑指offer】面试题32 - I:从
- 下一篇: Leetcode--494. 目标和