Two Sum

题目

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

题目描述:
给定一个 int 类型的数组,给定一个目标值,返回数组中任意两个值相加和等于目标值的值的下标数组

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

题目分析

/**
    提示: 
        假设每个输入都最少有一个,并且每个元素不能使用两次
    题解思路:
        题解假设:  
            1. 给定数组是否是排序后的 
            2. 给定的数组中是否有负数
            3. 给定数组中是否有一组以上和为目标值
        思路:
            1. 利用二分查找将数组进行分割,只保留小于目标值的部分 
            2. 初始化双层数组
            3. 利用双层循环进行遍历剩余数组元素,将其对应的 i j 保存到一个数组中
 */

题解

/**
    varsion 1
 */

class Solution_v1 {
/**
    获取符合目标的数组,
    通过递归的方式获取符合目标的数组
 */
public int[] targetArray(int[] nums, int target){
    if(nums.count <= 0) return nums;
    int index = nums.count / 2;
    if(nums[index] < target) {
        return nums.suArray(0, index);
    }else {
        subArray(nums.subArray(0, index), target);
    }
}

/**
    根据优化后的值,
    sums.count = 4
    i = 0, j = 0; 0 + 0, 0 + 1, 0 + 2, 0 + 3
    i = 1, j = 1; 1 + 1, 1 + 2, 1 + 3 
    i = 2, j = 2; 2 + 2, 2 + 3 
    i = 3, j = 3; 3 + 3
 */
public int[] twoSum(int[] sums, int target){
    int [][] result;
    for(int i = 0; i < sums.count; i++){
        for(int j = i ; i < sums.count; j++ ){
            if(sums[i ] + sums[j] == target){
                result.addObject([i, j]);
            }
        }
    }
}
}

/**
    说明: 
        通过以上方式,虽然通过递归的二分方法将原始数据进行了缩减  
        但是其根本的方式还是利用了双层for 循环嵌套的方式实现,其时间复杂度
        还是 O(n*n) 的 ,只不过通过方法1 缩减了n 的等量级
 */


/**------------------------------------------------------- */
/** 
    version 2

    反复理解题目, 需要找到的是 数组中 a + b = target   ,可以将其简单理解为 
    一种 a  b  配对, 配对条件为  a + b = target, 针对配对操作,KV 是非常合适的
    K 为 要查找的B 值 , value 是需要 A 值索引 


    思路: 
        通过 map 集合的方式,以 value 为key, index 为值存储 
        通过循环数组,然后遍 历其中每个值 
        如果 target - array[index] contain map 中,那么久返回对应的值,
        如果没在那么久直接将 array[index] 放入map 中
 */

class  Solution_v2 {
    public  int[] twoSum (int[] numbers , int target ){
        // 结果的 数组  
        int [] result = new int[2];
        // 创建map 结构
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        // 遍历目标数组
        for(int i = 0; i < numbers.length; i++){
            // 判断map 中是否包含与之对应的key  
            if(map.containKey(target - numbers[i])){
                result[1] = i+1;
                result[0] = map.get(target - number[i]);
                // 删除其已有的元素,
                return result;
            }
            map.put(number[i], i + 1);
        }
        return result;
    }
}

/**
    算法总结: 
        方法2 虽然解决了问题,但是其并没有解决每个元素只使用一次的问题


 */



/** 
 * 
 * 算法测试
 * 
 */

 class Test {
    public static void main(String[] args) {
        System.out.println("测试");
    }

}
Copyright © 抓🐱的🐟.com 2017 all right reserved,powered by Gitbook该文件修订时间: 2020-03-13 07:05:40

results matching ""

    No results matching ""