日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

在数组中找出3个数使得它们和为0

發(fā)布時(shí)間:2025/4/14 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在数组中找出3个数使得它们和为0 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:

給定一個(gè)集合S,試找出3個(gè)數(shù)a,?b,?c,使得a+b+c=0。也即從集合中找出所有的和為0的3個(gè)數(shù)。 例如:集合S={-1,0,?1,?2,?-1,?4},則滿足條件的3個(gè)數(shù)有2對:(-1, 0, 1)(-1, 2, -1)。注意(-1,1,0)與(-1,0,1)算同一個(gè)解,所以不用重復(fù)考慮。當(dāng)然該例子集合的解也可以寫成:(0, 1, -1)(2, -1, -1)

解法:

這個(gè)問題也被稱作3數(shù)和問題,3數(shù)和問題是下面這個(gè)問題的擴(kuò)展。
問題:給定一個(gè)n個(gè)元素的集合S,找出S中滿足條件的整數(shù)對A,B, ?使得A+B=K
假定集合S已經(jīng)排好序的話,則上面這個(gè)問題可以在O(n)的時(shí)間內(nèi)解決。使用2個(gè)索引值first和last,分別指向第一個(gè)元素和最后一個(gè)元素,設(shè)指向的第一個(gè)元素為A,則我們的任務(wù)就是找到對應(yīng)于A的元素B,B=K-A。如果last指向的元素小于B,則first加1,指向后面的一個(gè)元素;如果last指向的元素大于B,則last減1。這樣最終一步步逼近結(jié)果,時(shí)間復(fù)雜度為O(n)。該算法代碼如下: [cpp]?view plaincopy
  • /*k為和,a為元素?cái)?shù)組,n為數(shù)組大小*/??
  • [cpp]?view plaincopy
  • void?findsum(int?k,?int?a[],?int?n)?????
  • {??
  • ????bool?found?=?false;??
  • ????sort(a,?a+n);??//對數(shù)組排序??
  • ????int?i=0,?j=n-1;??
  • ????while?(i?<?j)?{??
  • ????????if?(a[i]?+?a[j]?<?k)??//和小于K,則i++??
  • ????????????i++;?????
  • ????????else?if?(a[i]?+?a[j]?>?k)?//和大于K,則j--??
  • ????????????j--;??
  • ????????else?{?//?找到了,a[i]+a[j]=k??
  • ????????????cout?<<?"find?"?<<?a[i]?<<?"+"??
  • ????????????????<<?a[j]?<<?"="?<<?k?<<?endl;??
  • ????????????i++;??
  • ????????????j--;??
  • ????????????found?=?true;??
  • ????????}??
  • ????}??
  • ????if?(!found)??
  • ????????cout?<<?"not?found"?<<?endl;??
  • }??
  • 在上面這個(gè)解法的基礎(chǔ)上,我們可以在O(n^2)的時(shí)間內(nèi)解決3數(shù)和問題。這里稍有不同的是,上面問題的和K不一定是數(shù)組中的元素,它只是程序指定的一個(gè)參數(shù)。而在3數(shù)和問題中,如果轉(zhuǎn)化為a+b=-c的問題,還需要保證-c在數(shù)組中。下面代碼采用了兩個(gè)循環(huán),第一個(gè)循環(huán)代表初始值,即先是第一個(gè)值a[0]不變,計(jì)算a[0]+a[1]+a[n-1],若大于0則k減1,計(jì)算a[0]+a[1]+a[n-2],若小于0則j加1,計(jì)算a[0]+a[2]+a[n-1]...如果存在多個(gè)重復(fù)值,這可能會(huì)加入重復(fù)的數(shù)對,不過使用數(shù)據(jù)結(jié)構(gòu)set可以解決該問題,相同的數(shù)對不會(huì)出現(xiàn)在set中。 [cpp]?view plaincopy
  • set<vector<int>?>?find_triplets(vector<int>?arr)??
  • {??
  • ??sort(arr.begin(),?arr.end());??
  • ??set<vector<int>?>?triplets;??
  • ??vector<int>?triplet(3);??
  • ??int?n?=?arr.size();??
  • ??for?(int?i?=?0;i?<?n;?i++)?{??
  • ????int?j?=?i?+?1;??
  • ????int?k?=?n?-?1;??
  • ????while?(j?<?k)?{??
  • ??????int?sum_two?=?arr[i]?+?arr[j];??
  • ??????if?(sum_two?+?arr[k]?<?0)?{??
  • ????????j++;??
  • ??????}?else?if?(sum_two?+?arr[k]?>?0)?{??
  • ????????k--;??
  • ??????}?else?{??
  • ????????triplet[0]?=?arr[i];??
  • ????????triplet[1]?=?arr[j];??
  • ????????triplet[2]?=?arr[k];??
  • ????????triplets.insert(triplet);??
  • ????????j++;??
  • ????????k--;??
  • ??????}??
  • ????}??
  • ??}??
  • ??return?triplets;??
  • }??


  • 總結(jié)

    以上是生活随笔為你收集整理的在数组中找出3个数使得它们和为0的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。