[LeetCode] [TOP-1] []と二つの数字

タイトル説明

  整数配列NUMSと目標値の目標を考えると、配列内の2つの整数の目標値を特定し、その配列の添字に戻るにお願いします。あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。
例えば
、所与のNUMS = [2、7、11 、15]、ターゲットは= 9、 NUMS [0] + NUMS [1ため ] = 2 + 7 = 9、 返された[0,1]

アイデア解析

  1. ソリューションは、暴力的なことができます
  2. 特性マップは、アレイ、メモリ素子内のハッシュテーブルを介して、Javaのハッシュ・テーブル・セットを利用して、同時に(目標値 - 現在の要素)を決定することができる結果は、ハッシュテーブルにハッシュテーブル場合に得られたかどうかをこれらの二つの添字が返されます。
  3. 自分自身のハッシュテーブルを達成する方法は、配列の直接使用。

Javaコード

public class TOP001 {
    public int[] twoSum(int[] nums, int target) {
        return Solution3(nums, target);
    }
    
    /**
     * 解法一:暴力解法
     * @param nums
     * @param target
     * @return
     */
    public int[] Solution1(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    return new int[] { i, j };
                }
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }

    /**
     * 解法二: 这里利用了java集合中map 哈希表的特性,遍历数组,将元素存入哈希表中, 并同时判断(目标值-当前元素)得到的结果是否在哈希表中,
     * 如果在哈希表中则返回这两个下标,
     * 
     * @param nums
     * @param target
     * @return
     */
    public int[] Solution2(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; i++) {
            int targetResult = target - nums[i];
            if (map.get(nums[i]) != null && nums[i] * 2 == target) {
                //此处针对于 2 +2 =4  4+4=8 这种 存在重复的情况,且重复的加起来正好是target
                return new int[] { map.get(targetResult), i };
            }
            if (map.containsKey(targetResult)) {
                return new int[] { map.get(targetResult), i };
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }

    /**
     * 解法三:
     * 利用手动哈希的方法,和解法二思路相同
     * @param nums
     * @param target
     * @return
     */
    public static int[] Solution3(int[] nums, int target) {
        int indexArrayMax = 2047;
        int[] indexArrays = new int[indexArrayMax + 1];
        for (int i = 0; i < nums.length; i++) {
            int diff = target - nums[i];
            int index = diff & indexArrayMax;
            if (indexArrays[index] != 0) {
                return new int[] { indexArrays[index] - 1, i };
            }
            indexArrays[nums[i] & indexArrayMax] = i + 1;
        }
        throw new IllegalArgumentException("No two sum value");
    }
}

コードリンク

安全コードを証明するためにオファー-Java

おすすめ

転載: www.cnblogs.com/haoworld/p/leetcodetop1-liang-shu-zhi-he.html