开始在LeetCode上刷题遇到的第一个问题:Two Sum
1、思路一:使用正则来匹配数据然后获取下标:
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var str=","+nums.toString()+",";
for(var i=0;i<nums.length;i++){
var info=target-nums[i];
var patt1 = new RegExp(","+info+",");
var result = patt1.test(str);
var init=nums.indexOf(info)
if(result && init!=i){
return [i,init];
}
}
};
结果:。。。。。很不理想,截图如下
思路2:使用indexOf函数获取下标
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var k=0;
for(var i=0;i<nums.length;i++){
k=nums.indexOf(target-nums[i]);
if(k!=-1 && k!=i){
return [i, k];
}
}
};
结果:一般般,还可以有改进的办法
思路3:数组下标和数值的反转
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var k=[];
var j=0;
var l=0;
for(var i=0;i<nums.length;i++){
l=nums[i];
j=k[target-l];
if(j!=undefined){
return [j,i];
}
k[l]=i;
}
};
结果:更进了一步,傻傻水
思路4:在思路3的基础上减少对数组下标的操作
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var k=[];
for(var i=0;i<nums.length;i++){
var l=nums[i];
var j=k[target-l];
if(j!=undefined){
return [j,i];
}
k[l]=i;
}
};
结果:比上一个好了一丢丢,没什么区别
思路5;当然也是借鉴别人的使用对象进行数据的存储
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var k={};
for(var i=0;i<nums.length;i++){
var l=nums[i];
var j=k[target-l];
if(j!=undefined){
return [j,i];
}
k[l]=i;
}
};
结果:感觉快了很多在100ms以内
总结:
起始思路4和思路5就只有一个地方的区别(数组和对象的区别),然而他们之间的差别还是非常的大的,这是为什么呢?因为,数组是一种特殊的对象。。。索引数组是有序的数据集,而对象是无序的。