Task4——三數之和

目錄

前言:

題目:

解題過程:

解題結果:

解題思路:

來源:


前言:

由於不太清楚官方給出的C代碼接口格式,所以本題使用C#進行解答。

題目:

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

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

示例:

給定數組 nums = [-1, 0, 1, 2, -1, -4],滿足要求的三元組集合爲:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

解題過程:

public class Solution {
    public IList<IList<int>> ThreeSum(int[] nums) {
        IList<IList<int>> ret = new List<IList<int>>();

        Array.Sort(nums);
        for(int i = 0; i < nums.Length; i++)
        {
            int m = i + 1;
            int n = nums.Length - 1;
            if(i == 0 || nums[i] != nums[i-1])
            {
                while (m < n)
                {
                    int sum = nums[i] + nums[m] + nums[n];
                    if (sum == 0)
                    {
                        ret.Add(new List<int> { nums[i], nums[m], nums[n] });
                        m++;
                        n--;
                        while (m < n && nums[m] == nums[m - 1]) m++;
                        while (m < n && nums[n] == nums[n + 1]) n--;
                    }
                    else if (sum < 0)
                    {
                        m++;
                    }
                    else if (sum > 0)
                    {
                        n--;
                    }
                }
            }
        }
        return ret;        
    }
}

解題結果:

解題思路:

本題的難點不在於尋找三數相加爲0的三元組,難點在於去除重複的三元組。本題在解決過程中的思路如下:

  • 先將傳入數據進行排序
  • 開始從頭遍歷,尋找三數和爲0的值
    • 遍歷過程中,先鎖定第一個值,記其索引爲i。同時還應對除nums[0]外的所有元素進行去重操作,即當nums[i]==nums[i-1]時,不進行查找
    • 從m = i+1向右遍歷第二個值,n = nums.Length-1向左遍歷第三個值
    • 由於輸入數組已經排序,記三數之和爲sum
      • sum==0時,即可記下此時的nums[i], nums[m], nums[n]。同時對左右兩側的指針索引進行自增和自減操作。並且還要分別對左右兩側分別去除相同數值
      • sum>0時,對向右索引指針自增
      • sum<0時,對向左索引指針自減

來源:

力扣(LeetCode)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章