LeetCode算法题解法体会

1.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.

题意:给定一个整数数组,寻找两个整数使它们的和等于target,并且返回它们的下标。题目假定只有唯一解,因此我们不用考虑其他情况。

example:

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

1.1 蛮力法

蛮力法是最简单也是最耗时的算法,直接两个for循环遍历数组并和target进行比较就能解决问题

var twoSum = function(nums, target) {
    var len = nums.length;
    for(var i = 0;i<len;i++){
        for(var j=i+1;j<len;j++){
            if(nums[i] + nums[j] == target){
                return [i,j];
            }
        }
    }
}

1.2 hash 表法

时间代价是O(n*n),但这很明显不是我们想要的答案,考虑有没有一种时间代价是O(n)的算法呢?那就是Hash表。JavaScript语言没有封装hash map,但由于hash表本质上是键值对,也即是对象,所以可以构建对象hash。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    var len = nums.length;
    var hash = {};

    //用hash表解决方法如下
    for(var i =0;i<len;i++){
        var diff = target - nums[i];
        if( hash[diff] !== undefined ){
            return [hash[diff],i];
        }
        hash[nums[i]] = i;//存入nums数组的每一个数
    }
};

2.two sum II–input array is sorted

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

题意:在一个已排序的数组中找出两个数,使得他们的和等于target,返回他们的下标。且下标不从0开始计算,要求下标也排好序。

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

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

本题和上一道题的区别是给定的是一个已排序的数组,我们可以从两头向中间遍历。两数之和小于target,则左边的下标右移。若大于target,则右边的下标左移。因此这样用蛮力法的时间代价也是O(n)。

2.1蛮力法

/**
 * @param {number[]} numbers
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(numbers, target) {
    //蛮力算法
    var left=0, right=numbers.length-1;
    while(numbers[left] + numbers[right] !== target){
        if(numbers[left] + numbers[right] < target){
            left++;
        }else {
            right--;
        }
    }
    return [left+1, right+1];
};

2.2hash表法

用hash表法的过程和上一道题一样,没有变化。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    var len = nums.length;
    var hash = {};

    //用hash表解决方法如下
    for(var i =0;i<len;i++){
        var diff = target - nums[i];
        if( hash[diff] !== undefined ){
            return [hash[diff],i];
        }
        hash[nums[i]] = i;//存入nums数组的每一个数
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值