• 两数相加


    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

    以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

    你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

    你所设计的解决方案必须只使用常量级的额外空间。

    两种实现:

    二分查找

    点击查看代码
    public int[] twoSum(int[] numbers, int target) {
            int[] result = new int[2];
            for (int i = 0; i < numbers.length; i++) {
                //二分查找另外一个数
                int possibleLocation = findTarget(i+1,numbers, target-numbers[i]);
                if (possibleLocation!=-1){
                    result[0] = i;
                    result[1] = possibleLocation;
                    return result;
                }
            }
            return result;
        }
    
        private int findTarget(int left, int[] numbers, int target) {
            int right = numbers.length - 1;
            while (left <= right) {
                int mid = left + (right - left) / 2;
                if (numbers[mid] == target) {
                    return mid;
                } else if (numbers[mid] < target) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
            return -1;
        }
    

    算法时间复杂度: nlogn

    双指针法

    点击查看代码
    public int[] twoSumII(int[] numbers, int target){
            int left = 0;
            int right = numbers.length - 1;
            while (left <= right){
                if (numbers[left] + numbers[right] == target){
                    break;
                }
                // 这里的理解是: numbers[left] 和 numbers[right] 分别是解空间的最小值和最大值
                else if (numbers[left] + numbers[right] > target){
                    right--;
                }else {
                    left++;
                }
            }
            int[] result = new int[2];
            result[0] = left;
            result[1] = right;
            return result;
        }
    

    时间复杂度: n

  • 相关阅读:
    Java并发编程:synchronized
    对一致性Hash算法,Java代码实现的深入研究
    在Xcode中使用Git进行源码版本控制
    这些 Git 技能够你用一年了
    简明 Git 命令速查表
    Git 分支管理是一门艺术
    2016年Web前端面试题目汇总
    iOS 面试基础题目
    Json数据交互格式介绍和比较
    SpringBoot端口和访问路径
  • 原文地址:https://www.cnblogs.com/ruirui610/p/16389386.html
Copyright © 2020-2023  润新知