leetcode-2023/01/06

42 阅读1分钟
/**
 * 给定一个数组和一个值
 * 找到这个值在数组的下标
 * @param nums
 * @param val
 */
public static void searchForIndex(int[] nums, int val) {
    for (int i = 0; i < nums.length-1; i++) {
        if (nums[i] == val){
            System.out.println(i);
        }
    }
}

/**
 * 暴力法
 * 遍历每个元素 xx,并查找是否存在一个值与 target - xtarget−x 相等的目标元素
 * @param nums
 * @param target
 */
public static void twoSum(int[] nums, int target) {
    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[j] == target - nums[i]) {
                System.out.println("{"+i+","+j+"}");
            }
        }
    }
}


/**
 * 两遍hash表
 * 一个简单的实现使用了两次迭代。
 * 在第一次迭代中,我们将每个元素的值和它的索引添加到表中
 * 然后,在第二次迭代中,我们将检查每个元素所对应的目标元素(target - nums[i]target−nums[i])是否存在于表中
 * 注意,该目标元素不能是 nums[i]nums[i] 本身
 * @param nums
 * @param target
 */
public static void twoSumTwoHash(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
            System.out.println("{"+i+","+map.get(complement)+"}");
        }
    }
}

/**
 * 一遍Hash表
 * 可以一次完成
 * 在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素
 * 如果它存在,那我们已经找到了对应解,并立即将其返回
 * @param nums
 * @param target
 */
public static void twoSumOneHash(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            System.out.println("{"+map.get(complement)+","+i+"}");
        }
        map.put(nums[i], i);
    }
}