zoukankan      html  css  js  c++  java
  • 【LeetCode】[0001] 【两数之和】

    题目描述

      给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
    示例
    给定 nums = [2, 7, 11, 15], target = 9 ,因为 nums[0] + nums[1] = 2 + 7 = 9 , 所以返回 [0, 1]

    思路分析

    1. 可以暴力解
    2. 可以利用了java集合中map 哈希表的特性,遍历数组,将元素存入哈希表中,并同时判断(目标值-当前元素)得到的结果是否在哈希表中,如果在哈希表中则返回这两个下标。
    3. 自己实现哈希表的方式,直接用数组。

    Java代码

    public class TOP001 {
        public int[] twoSum(int[] nums, int target) {
            return Solution3(nums, target);
        }
        
        /**
         * 解法一:暴力解法
         * @param nums
         * @param target
         * @return
         */
        public int[] Solution1(int[] nums, int target) {
            for (int i = 0; i < nums.length; i++) {
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[i] + nums[j] == target) {
                        return new int[] { i, j };
                    }
                }
            }
            throw new IllegalArgumentException("No two sum solution");
        }
    
        /**
         * 解法二: 这里利用了java集合中map 哈希表的特性,遍历数组,将元素存入哈希表中, 并同时判断(目标值-当前元素)得到的结果是否在哈希表中,
         * 如果在哈希表中则返回这两个下标,
         * 
         * @param nums
         * @param target
         * @return
         */
        public int[] Solution2(int[] nums, int target) {
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            for (int i = 0; i < nums.length; i++) {
                int targetResult = target - nums[i];
                if (map.get(nums[i]) != null && nums[i] * 2 == target) {
                    //此处针对于 2 +2 =4  4+4=8 这种 存在重复的情况,且重复的加起来正好是target
                    return new int[] { map.get(targetResult), i };
                }
                if (map.containsKey(targetResult)) {
                    return new int[] { map.get(targetResult), i };
                }
                map.put(nums[i], i);
            }
            throw new IllegalArgumentException("No two sum solution");
        }
    
        /**
         * 解法三:
         * 利用手动哈希的方法,和解法二思路相同
         * @param nums
         * @param target
         * @return
         */
        public static int[] Solution3(int[] nums, int target) {
            int indexArrayMax = 2047;
            int[] indexArrays = new int[indexArrayMax + 1];
            for (int i = 0; i < nums.length; i++) {
                int diff = target - nums[i];
                int index = diff & indexArrayMax;
                if (indexArrays[index] != 0) {
                    return new int[] { indexArrays[index] - 1, i };
                }
                indexArrays[nums[i] & indexArrayMax] = i + 1;
            }
            throw new IllegalArgumentException("No two sum value");
        }
    }
    

    代码链接

    LeetCode-Java

  • 相关阅读:
    服务器模型??
    tcp和udp详解??
    osi七层模型??
    高内聚 低耦合??
    进程和线程的区别和联系??
    2019.10.03题解
    2019.10.02题解
    2019.09.29考试报告
    2019.09.27考试报告
    2019.09.26考试报告
  • 原文地址:https://www.cnblogs.com/haoworld/p/leetcodetop1-liang-shu-zhi-he.html
Copyright © 2011-2022 走看看