leetcode算法-三數之和


一、題目

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

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

 

示例:

給定數組 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]

二、解題思路

1、新建集合

2、應當判定的只要數組的長度小於三就直接返回空集合

3、然后對數組進行排序(不進行排序是無序數組,遍歷查找工作相當復雜,而且效率極低)

4、遍歷排好序的數組,外層for循環,內層雙指針移動的方法,將外層循環的數和雙指針指向的數相加,只要相同,就存入存值集合,之后指針分別向中間移動,要判斷如果指針指向的前一個數和后一個數相同那么繼續移動指針

5、注意:外層只要遍歷到了某個數大於0,那么就直接返回此時的存值集合(因為是排好序的集合,只要大於0了,后面怎么遍歷都不會等於0)

三、代碼:

public static void main(String[] args) {
    int[] arrays = new int[] {-2,0,1,1,2};
    System.out.println(getArraysSort(arrays));
    
}
public static List<List<Integer>> getArraysSort(int[] arrays) {
    List<List<Integer>> returnList = new ArrayList<List<Integer>>();
    // 獲取數組長度
    int length = arrays.length;
    if(length < 3) {
        return returnList;
    }
    // 數組排序
    Arrays.sort(arrays);
    // 采用指針進行遍歷,找值
    for(int i = 0;i < length;i++) {
        // 判斷剩余的數是否都為正數
        if(arrays[i] > 0) {
            return returnList;
        }
        // 判斷數字是否重復
        if(i > 0 && arrays[i] == arrays[i - 1]) {
            continue;
        }
        int left = i + 1;
        int right = length - 1;
        while(left < right) {
            int temp = arrays[i] + arrays[left] + arrays[right];
            if(temp == 0) {
                List<Integer> list = new ArrayList<Integer>();
                list.add(arrays[i]);
                list.add(arrays[left]);
                list.add(arrays[right]);
                returnList.add(list);
                left++;
                right--;
                while(left < right && arrays[left] == arrays[left - 1]){
                        left++;
                    }
                while(left < right && arrays[right] == arrays[right + 1]){
                        right--;
                       }
                continue;
            }else if(temp < 0) {
                left++;
                continue;
            }else {
                right--;
                continue;
            }
            
        }
    }
    
    return returnList;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM