• 力扣-167号题.两数之和II-输入有序的数组


    目录

    力扣-167号题.两数之和II-输入有序的数组

    第一种解法:暴力解法

    第二种解法:map

    第三种解法:碰撞指针

    代码实现


    力扣-167号题.两数之和II-输入有序的数组

    这道题并不难,但是我们要注意到他的下标是从1开始的整数组,而且已经是按非递减顺序排列的。并且返回的数组长度仅为2,每个输入只对应唯一一个答案,而且不可以重复使用相同的元素

    第一种解法:暴力解法

    1. /*
    2.     * 暴力解法
    3.     * */
    4.   public int[] twoSum02(int[] numbers, int target) {
    5.       if (numbers == null || numbers.length == 0) {
    6.           return null;
    7.       }
    8.       for (int i = 0; i < numbers.length; i++) {
    9.           for (int j = i+1; j < numbers.length; j++) {
    10.               if (numbers[i]+numbers[j]==target){
    11.                   return new int[]{i+1,j+1};
    12.               }
    13.           }
    14.       }
    15.       return null;
    16.   }

    ps:这里为什么返回的数组的下标要加1,是因为我们这里数组的下标是从0开始的,并且我们的循环也是从0开始的,所以要给最终的索引结果加1,后面的解法亦是如此

    第二种解法:map

    1. /*
    2.     * 使用map
    3.     *
    4.     * */
    5.   public int[] twoSum01(int[] numbers, int target) {
    6.       if (numbers == null || numbers.length == 0) {
    7.           return null;
    8.       }
    9.       // KEY--->value VALUE--->index
    10.       HashMap map = new HashMap<>();
    11.       for (int i = 0; i < numbers.length; i++) {
    12.           int sub = target - numbers[i];
    13.           if (map.containsKey(sub)) {
    14.               return new int[]{map.get(sub) + 1, i + 1};
    15.           } else {
    16.               map.put(numbers[i], i);
    17.           }
    18.       }
    19.       return null;
    20.   }

    这里我们主要使用了一个减法的特性,通过去找目标数字的差值从而达到解决我们这个问题,同样返回的结果索引是要加1的

    第三种解法:碰撞指针

    这个方法并不难难理解,声明两个指针,一个在数组开始的位置,一个在数组的尾部

    • 如果两个指针一开始的位置就是我们的目标值,我们直接返回其索引加1

    • 如果相加大于我们的目标值,那就说明我们需要将右边的指针向左移动,因为这个数组是已经按照升序排列的,如果大的话,将右边指针向左移动才能减少其值

    • 如果相加的值小于我们的目标值,那我们就将左边的指针向右移动

    代码实现

    1. /*
    2. * 碰撞指针
    3. * */
    4. public int[] twoSum03(int[] numbers, int target) {
    5.   if (numbers == null || numbers.length == 0) {
    6.       return null;
    7.   }
    8.   // 声明指针(2)
    9.   int i = 0;
    10.   int j = numbers.length - 1;
    11.   for (; i < j; ) {
    12.       if (numbers[i] + numbers[j] == target) {
    13.           return new int[]{i + 1, j + 1};
    14.       } else if (numbers[i] + numbers[j] > target) {
    15.           j--;
    16.       } else {
    17.           i++;
    18.       }
    19.   }
    20.   return null;
    21. }
  • 相关阅读:
    安全自动化企业网络架构 (毕设分享)
    处理医学时间序列中缺失数据的3种方法
    【云栖 2023】林伟:大数据 AI 一体化的解读
    SQLMAP自动注入-优化参数
    Mybatis自定义类型映射处理器
    AGC034E Complete Compress
    策略模式——多重if-else解决方案
    kotlin-高级特性一
    葡聚糖修饰的Hrps共价三聚肽(三种Hrps多肽和葡聚糖通过共价修饰形成共价三聚肽,其结构通式为:(3Hrps)(CHO))
    如何处理Vue2项目里大规模的数据计算?
  • 原文地址:https://blog.csdn.net/weixin_51971817/article/details/127966818