Java算法題:三數(shù)之和

題目來自:https://leetcode-cn.com/problems/3sum/description/

給定一個包含?n?個整數(shù)的數(shù)組nums,判斷nums中是否存在三個元素?a,b,c ,使得a + b + c =?0 ?找出所有滿足條件且不重復(fù)的三元組。

注意:答案中不可以包含重復(fù)的三元組。

例如, 給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[

? [-1, 0, 1],

? [-1, -1, 2]

]

思路:

? ? ? ? 這道題挺簡單的。

? ? ? ? 首先要明白一個三元組關(guān)系 a>=b>=i 所以首先就是把數(shù)組按從小到大重新排序。

? ? ? ? 了解?二元組的和等于給定值sum?情況的話,就知道數(shù)組排序后,用兩個指向數(shù)組的指針,一個從前向后掃描,一個從后向前掃描,記為first和last;

????????當(dāng) first + last == sum 則找到了一對二元組,它們的和等于sum;

????????如果 first + last < sum 則再去取左邊更大的值,所以 first++;

? ? ? ? 如果 first + last > sum 則再去取右邊更小的值,所以 last-- 。

????????同樣,三元組的情況,先將數(shù)組從小到大排序,然后固定一個元素 chooiseNum?,再去尋找一個二元組的和為sum + chooiseNum == 0 ,這樣就將三元組的問題,轉(zhuǎn)換成了二元組的問題。

private static int[] num = {-1, 0, 1, 2, -1, -4};

public static void main(String[] args) {

????????sortNums(num);

????????System.out.print("排序后的數(shù)組:");

????????for (int i = 0; i < num.length; i++) {

????????????????????System.out.print(num[i] + " ");

????????}

????????System.out.println(" ");

????????solutionThirdNum(num);

}

public static void solutionThirdNum(int[] nums) {

????????for (int i = 0; i< nums.length; i++) {

? ??????????????????int chooiseNum = nums[i];

????????????????????int left = 0, right = nums.length-1;

? ??????????????????while(left < right) {

? ??????????????????????????int sum = nums[left] + nums[right];

????????????????????????????if(i == left || i == right) {

????????????????????????????????????break;

????????????????????????????}

????????????????????????????if(chooiseNum + sum < 0) {

????????????????????????????????????left++;

????????????????????????????????????continue;????

????????????????????????????}

????????????????????????????if(chooiseNum + sum > 0) {

????????????????????????????????????right--;

????????????????????????????????????continue;

????????????????????????????}

????????????????????????????if(chooiseNum + sum == 0) {

????????????????????????????????????????if(left >= i ) {

????????????????????????????????????????System.out.println(" [ " + nums[i] + ","+? nums[left] +"," + nums[right] + " ]");

????????????????????????????????????????}

????????????????????????????????????????if(left < i && i < right) {

????????????????????????????????????????????System.out.println(" [ " + nums[left] + ","+? nums[i] +"," + nums[right] + " ]");

????????????????????????????????????????}

????????????????????????????????????????if(right <= i) {

????????????????????????????????????????????????System.out.println(" [ " + nums[left] + ","+? nums[right] +"," + nums[i] + " ]");

????????????????????????????????????????}

????????????????????????????????????????break;

????????????????????????????}

????????????????????}

????????}

}


// 冒泡排序--> 從小到大

public static int[] sortNums(int[] sortNum) {

????????????for (int i = 0; i < sortNum.length - 1; i++) {

????????????????????for (int j = 0; j < sortNum.length - i - 1; j++) {

????????????????????????????if (sortNum[j] > sortNum[j + 1]) {

????????????????????????????????int temp = sortNum[j];

????????????????????????????????sortNum[j] = sortNum[j + 1];

????????????????????????????????sortNum[j + 1] = temp;

????????????????????????????????}

????????????????????????}

????????????????}

????????????????return sortNum;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一...
    阿里高級軟件架構(gòu)師閱讀 3,399評論 0 19
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,935評論 0 33
  • 落花落去 流水歸去 兩處愁 長了 短了 河山有殤 佳人依舊 不過是 肥了 瘦了
    小麥iii閱讀 475評論 2 9
  • 高鐵上一老兄打了若干次電話,每次嗓門都很大,而且聽起來是在安排工作,把溝通信息紕漏無遺。旁邊看書的、發(fā)呆的、用電腦...
    周力之閱讀 417評論 0 0
  • 我覺得最怕等紅燈的人應(yīng)該是女人 待在原地眼睜睜看著時間流走 逃也逃不掉 一秒一秒的數(shù)著自己變老 那紅綠燈旁邊的倒計...
    AI大叔閱讀 334評論 0 0

友情鏈接更多精彩內(nèi)容