天天AC系列(一):三數之和

1 題目

LeetCode第15題,難度中等,題目描述:java

給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出全部知足條件且不重複的三元組。git

注意:答案中不能夠包含重複的三元組。github

在這裏插入圖片描述

2 解法

什麼也無論先來個O(n3):算法

for(int i=0;i<nums.length;++i)
{
    for(int j=i+1;j<nums.length;++j)
    {
        for(int k=j+1;k<nums.length;++k)
        {
            if(nums[i]+nums[j]+nums[k] == 0)
            {
                ArrayList<Integer> arrayList = new ArrayList<>();
                arrayList.add(nums[i]);
                arrayList.add(nums[j]);
                arrayList.add(nums[k]);
                result.add(arrayList);
            }
        }
    }
}

在這裏插入圖片描述

well.數組

3 優化

上面暴力算法的思想就是單純三個循環,優化的方法能夠考慮下降一個循環,使用"雙指針"的思想,首先對數組進行排序,而後一開始固定一個數,而後讓兩個指針一個指向這個數的右區間的起點,一個指向終點,不斷計算這三個值的和,根據得出的和移動左指針或者右指針,一共三種狀況:優化

  • 和等於0,同時移動左右指針,二者向中間方向移動.
  • 和大於0,說明取值過大,須要把右指針向左移動.
  • 和小於0,說明取值太小,須要把左指針向右移動.

基於以上的三種狀況,寫出了以下代碼:指針

List<List<Integer>> result = new ArrayList<>();
if (nums.length == 3 && nums[0] + nums[1] + nums[2] == 0)
    result.add(Arrays.asList(nums[0], nums[1], nums[2]));
else if (nums.length > 3) 
{
    Arrays.sort(nums);
    Set<List<Integer>> resultSet = new HashSet<>();
    for (int i = 0; i < nums.length - 2 && nums[i] <= 0; ++i) 
    {
        int left = i + 1;
        int right = nums.length - 1;
        while (left < right) 
        {
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == 0) 
            {
                if (!resultSet.contains(Arrays.asList(nums[i], nums[left], nums[right]))) 
                    resultSet.add(Arrays.asList(nums[i], nums[left], nums[right]));
                --right;
                ++left;
            } 
            else if (sum > 0)
                --right;
            else
                ++left;
        }
    }
    result.addAll(resultSet);
}

首先判斷數組的長度是否大於等於3,小於3的話直接返回一個空List,等於3判斷是否這三個數之和爲0,大於3的話,首先排序,接着須要確保被肯定的相對不移動的數爲負數,這樣的話剩下兩個數的和纔有可能爲正數,不然的話會形成所有都是正數還要進行判斷的局面.接着計算left指針與right指針的值,一直判斷直到兩指針相遇.code

4 提交

在這裏插入圖片描述

AC!blog

5 完整代碼

github排序

碼雲

相關文章
相關標籤/搜索