1. 程式人生 > 其它 >C# 求陣列兩數之和,這兩數的下標

C# 求陣列兩數之和,這兩數的下標

給定一個整數陣列 nums 和一個整數目標值 target,請你在該陣列中找出 和為目標值 target  的那 兩個 整數,並返回它們的陣列下標。

你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素在答案裡不能重複出現。你可以按任意順序返回答案。

示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:

輸入:nums = [3,3], target = 6
輸出:[0,1]

最開始想到這個問題就讓我想到了氣泡排序,但是一想同一個元素不能重複出現兩次。

public static (int,int) FVG(int[] nums)
{
    // 需要遍歷很多次,時間複雜度是 O(n)
    int target = 9;
    for (int i = 0; i < nums.Length; i++)
    {
        for (int j = i + 1; j < nums.Length; j++)
        {
            if (nums[i] + nums[j] == target)
            {
                return (i, j);
            }
        }
    }
    return (0,0);
}

這個方式也就作罷。往資料結構去想,想到了陣列,連結串列,散列表,同一個元素不能出現兩次,那就說明查詢的時間複雜度不能是 O(N),也就是說不能遍歷所有。那就只有找一個查詢快而且不會遍歷全部的資料結構——散列表
對應在C#裡,就有字典** Dictionary<string,string>** **HashTable HashSet **可用來實現,HashSet類主要是設計用來做高效能集運算的,例如對兩個集合求交集、並集、差集等,在此處不是很合適。

public static (int, int) UseHash(int[] nums, int target = 9)
{
    Hashtable hashtable = new Hashtable();
    for (int i = 0; i < nums.Length; i++)
    {
        hashtable.Add(nums[i], i);
    }
    for (int i = 0; i < nums.Length; i++)
    {
        var dd = target - nums[i];
        // 遍歷 時間複雜度接近是是 O(1)
        if (hashtable.ContainsKey(dd) && int.Parse(hashtable[dd].ToString()) != i)
        {
            return (i, int.Parse(hashtable[dd].ToString()));
        }
        hashtable.Add(nums[i], i);
    }
    return(0,0);
}

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/two-sum