zoukankan      html  css  js  c++  java
  • 【LeetCode】167. 两数之和 II

    题目描述

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

    函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

    说明:

    返回的下标值(index1 和 index2)不是从零开始的。
    你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

    示例:

    输入: numbers = [2, 7, 11, 15], target = 9
    输出: [1,2]
    解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
    

    题解

    暴力法

    时间复杂度:O(n2)

    class Solution {
        public int[] twoSum(int[] numbers, int target) {
            int[] ans = new int[2];
            int len = numbers.length;
            for (int i = 0; i < len - 1; i++) {
                int need = target - numbers[i];
                for (int j = i + 1; j < len; j++) {
                    if (numbers[j] == need) {
                        ans[0] = i + 1;
                        ans[1] = j + 1;
                        return ans;
                    }
                }
            }
            return ans;
        }
    }
    

    双指针

    时间复杂度:O(n)

    class Solution {
        public int[] twoSum(int[] numbers, int target) {
            int left = 0, right = numbers.length - 1, mid;
            while(left < right){
                mid = numbers[left] + numbers[right];
                if(mid == target)
                    return new int[] {left + 1, right + 1};
                else if(mid < target)
                    left ++;
                else
                    right --;
            }
            return null;
        }
    }
    

    二分查找

    时间复杂度:O(nlogn)

    class Solution {
        public int[] twoSum(int[] num, int target) {
            for (int i = 0; i < num.length; i++) {
                int low = i + 1, high = num.length - 1;
                int val = target - num[i];
                while (low <= high) {
                    int mid = low + (high - low) / 2; //用>>会超时。。。
                    if (num[mid] == val)
                        return new int[]{i + 1, mid + 1};
                    else if (num[mid] < val)
                        low = mid + 1;
                    else
                        high = mid - 1;
                }
            }
            return null;
        }
    }
    

    哈希表

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
        public int[] twoSum(int[] num, int target) {
            Map<Integer, Integer> map = new HashMap<>(num.length);
            for (int i = 0; i < num.length; i++) {
                if (map.get(target - num[i]) != null) {
                    return new int[]{map.get(target - num[i]) + 1, i + 1};
                }
                map.put(num[i], i);
            }
            return null;
        }
    }
    /* 或者
    public int[] twoSum(int[] numbers, int target) {
        int[] ans = new int[2];
        int len = numbers.length;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < len; i++) {
            map.put(numbers[i], i + 1);
        }
        for (int i = 0; i < len; i++) {
            int need = target - numbers[i];
            if (map.containsKey(need)) {
                ans[0] = i + 1;
                ans[1] = map.get(need);
                return ans;
            }
        }
        return ans;
    }
    */
    
  • 相关阅读:
    KVM -> 热迁移_05
    KVM -> 虚拟机磁盘管理_03
    使用光盘搭建本地yum源
    KVM -> 虚拟机管理&console登录_02
    使用windows-SQLyog连接linux-mysql
    linux下登陆mysql失败
    忘记root密码时如何重设密码
    批处理程序:自动登陆服务端,并循环执行某些命令
    linux--磁盘分区
    linux--档案与目录管理
  • 原文地址:https://www.cnblogs.com/melodyjerry/p/13346149.html
Copyright © 2011-2022 走看看