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

    标签:数组,哈希表

    链接:

    https://leetcode-cn.com/problems/two-sum

    描述:

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

    示例:
    给定 nums = [2, 7, 11, 15], target = 9
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

    vector<int> twoSum(vector<int>& nums, int target) {}

    思路:

    先考虑一道简单题:如何在一个整数数组 (nums) 中查找一个目标值 (temp)

    使用最直接的思路,遍历数组中的元素。

    for(int j = 0; j < size; j++){
        if(nums[j] == temp){
            return j;
        }
    }
    

    然后,回到本题:如何在一个数组中找出和为目标值的那两个整数。

    遍历数组的每一个元素 (nums[i]) 时,
     在前段数组中查找是否存在值为 (target - nums[i])。【上面的简单题】

    复杂度分析:
     时间复杂度:(O(n^2))
     空间复杂度:(O(1))

    C++

    展开后查看
    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            for(int i = 0; i < nums.size(); i++){
                int temp = target - nums[i];
                for(int j = 0; j < i; j++){
                    if(nums[j] == temp){
                        return {j, i};
                    }
                }
            }
            return {-1, -1};
        }
    };
    

    Java

    展开后查看
    class Solution {
        public int[] twoSum(int[] nums, int target) {
            for(int i = 0; i < nums.length; i++){
                int temp = target - nums[i];
                for(int j = 0; j < i; j++){
                    if(nums[j] == temp){
                        return new int[]{j, i};
                    }
                }
            }
            return new int[]{-1, -1};
        }
    }
    

    优化:使用哈希表

    对于上面算法,检查前段数组中是否存在目标元素这一步,比较费时。
    可以使用哈希表存储前段数组,加快查找速度,用空间换时间。

    遍历数组的每一个元素 (nums[i]) 时,
     在哈希表中查找是否存在值为 (target - nums[i])
     存在,就可以直接返回了
     否则,将当前元素 ((nums[i], i)) 作为 ((key, value)) 存入哈希表中

    C++

    展开后查看
    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            unordered_map<int, int> map;
            for(int i = 0; i < nums.size(); i++){
                int temp = target - nums[i];
                if(map.count(temp) == 1){
                    return {map[temp], i};
                }
                map[nums[i]] = i;
            }
            return {-1, -1};
        }
    };
    

    Java

    展开后查看
    class Solution {
        public int[] twoSum(int[] nums, int target) {
            Map<Integer, Integer> map = new HashMap<>();
            for(int i = 0; i < nums.length; i++){
                int temp = target - nums[i];
                if(map.containsKey(temp)){
                    return new int[]{map.get(temp), i};
                }
                map.put(nums[i], i);
            }
            return new int[]{-1, -1};
        }
    }
    
  • 相关阅读:
    SGU 499 Greatest Greatest Common Divisor
    pku 3468 A Simple Problem with Integers
    pku2226 Muddy Fields
    pku3041 Asteroids
    java基础string操作
    PowerDesigner(7)转载
    java基础2
    PowerDesigner(6)转载
    java基础3
    java基础(1)
  • 原文地址:https://www.cnblogs.com/crazyBlogs/p/13048691.html
Copyright © 2011-2022 走看看