今天开始自己的leetcode刷题之旅,希望能多多锻炼自己的思维和代码能力!
先从easy的开始
题目简介:给出一个数组,从中找到两个数相加等于目标值,返回这两个数的下标
解法一:暴力突破,时间复杂度o(n*n)
思路:两层循环,第一层循环确定第一个加数,第二层循环,让第一个加数与数组的每一个值相加,如果结果等于目标值,并且两个数的下标不相等,那么就输出这两个数的下标
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var temp=0;
for(var i=0;i<nums.length;i++){
temp=nums[i];
for(var j=0;j<nums.length;j++){
if(temp+nums[j]==target && j!=i){
return [i,j];
}
}
}
};
解法二 :利用哈希,时间复杂度O(n)
思路:首先将数组的值保存到hash表中,然后在下一个循环中判断(target-num[j])在hash表中是否存在,如果存在且二者下标不相等的话,那么就返回二者的下标
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var hash={};
for(var i=0;i<nums.length;i++){
hash[nums[i]]=i;
}
for(var j=0;j<nums.length;j++){
if(hash[target-nums[j]] && j!=hash[target-nums[j]]){
return [j,hash[target-nums[j]]];
}
}
};
解法三:把解法二再稍稍优化一点点
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var hash={};
var temp=0;
for(var i=0;i<nums.length;i++){
temp=hash[target-nums[i]];
if(temp!==undefined && temp!=i)
return [temp,i];
hash[nums[i]]=i;
}
};
本来以为写一道题可简单了,一下子就通过了,但是要写出优秀的代码来,还是很费劲啊