• 【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;
    }
    */
    
  • 相关阅读:
    C++学习笔记十关联容器
    Ubuntu下使用GDB断点Go程序
    各种语言的数字转罗码方法的实现
    为什么 ++i和i++的效果是一样的,试了javascript ,c++ java
    罗马数字转换阿拉伯数字(Java版,考虑较为全面)
    C++学习笔记九顺序容器(二) ForFreeDom 博客园
    智立方 屁话真言108:能盛事者能成事_智立方的杨石头_新浪博客
    腾讯搜搜高管吴军离职的传闻与真相
    罗马数字_百度百科
    快速深入一门语言的几个问题 Shell909090 随笔杂记
  • 原文地址:https://www.cnblogs.com/melodyjerry/p/13346149.html
Copyright © 2020-2023  润新知