整数配列numsと整数ターゲット値ターゲットが与えられた場合、合計がターゲット値ターゲットである配列内の2つの整数を見つけて、それらの配列インデックスを返します。【LeetCodeHot100】

最もホットな質問100の質問1:

方法1:ブルートフォース列挙法

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
}

アイデア:この質問では、ターゲットに等しい配列内の2つの数値の合計を見つけ、最初の数値がiであり、2番目の数値がtarget-iであると想定し、配列を直接トラバースしてiを見つけ、次にこれをトラバースする必要があります。ループ中に、配列を再度トラバースして、target-i、つまり2層ループトラバーサルを見つけます。時間計算量:O(N ^ 2)O(N2);空間計算量:O(1)O(1)。

方法2:ハッシュテーブルを使用する

class Solution {
    public int[] twoSum(int[] nums, int target) {
        //新建哈希表,用于存储数据;key为下表为i的值,value为数组的下标
        Map<Integer,Integer> map = new HashMap<>();

        //for循环遍历数组,先判断哈希表中是否存在target-i,若不存在将当前i的值和下标i存入哈希表
        for(int i = 0;i < nums.length;i++){
            int cur = nums[i];
            if(map.containsKey(target - cur)){
                return new int[]{i,map.get(target - cur)};
            }
            map.put(cur,i);
        }
        //哈希表遍历完都没返回,说明数组中不存在和为target的两个数
        return new int[]{0};
    }
}

アイデア:方法1を使用すると実際に問題を解決できますが、必要な時間計算量が高すぎるため、より効率的な方法はありますか?答えはイエスです。

タイトルから、返す必要のある2つの数値の合計がターゲットであり、最初の数値がiであると想定され、次に他の数値がターゲットであることがわかります-i、iにトラバースするとき、前のトラバースを見てくださいの数にtarget-iはありますか?ある場合、ループのレイヤーを保存できますか?したがって、ここでは、以前にトラバースされたデータを格納するためにハッシュテーブルを参照します。

新しいハッシュテーブルを作成したら、配列のトラバースを開始します。最初は、ハッシュテーブルに要素がないため、見つからないようにする必要があります。ハッシュテーブルにtarget-iが見つからない場合は、現在のi値を保存します。ハッシュテーブルに移動し、2つの数値が見つかるまでトラバースを続けます。

おすすめ

転載: blog.csdn.net/weixin_56960711/article/details/123276882