目录
暴力法
原理
伪代码
• function(nums,target) -->[]
//题目给的function,nums数组,target目标值;要求你返回数组 [],里面存储下标(谁的,目标值的)
• result=[]
//建立一个储存下标的数组[],长度为2
• for i in [0,length(nums)]
• for j in[i+i,length(nums)]
//建立两个指针i,j;其中i是起始固定的,j是往后移动的;i和j的范围(i从0到数组最后,j从1到数组最后;j永远在i后面一个单位)
• sum = nums[i] + nums[j]
//统计下标为i和j的数组到sum中,然后让sum和target比较,成功则赋值跳出
• if sum =target
• result[0]=i
• result[i]=j
• return result
//据说到这就结束了
• return result
//如果是java;而python不需要这句return,JavaScript按理说同python也不需要
哈希表法
好处:如果是遍历一遍取下标,复杂度为O(N),哈希表貌似低
原因:正常遍历会因元素个数和目标值的位置而影响;如果有100元素,恰目标值处于最后,要遍历很多次(将近100次)
哈希表则遍历一次储存表中,再次遍历把目标值拿到哈希表中比对(听起来好像只用两次o(2))少很多
原理
伪代码
function(nums,target)
result=[]
map = HashTable()
//建立哈希表map
for i in[0,length(nums)]
map.add(nums[i],i)
//定义完i,j范围,接着补充到map表中
for j in[0,length(nums)]
//记不记得js中的for循环的功能是遍历;通过遍历我们找到差值
diff=target - nums[j]
//diff记录目标值与指针j的差值,然后差值在哈希表中查找返回
if(map.containskey(diff)and
map.get(diff)!=j)
//这里是说如果哈希表中有符合差值的;且不是重复的本身(题目中的要求不能是同一个元素)
//如果真的在哈希表中找到了和diff差值相等的数,说明了鸡毛,
我们把索引0,i修改为j和diff差值所在的索引
result[0]=j
result[i]=map.get(diff)
return result
//java需要
return result
js版
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
// 创建新map
const map = new Map();
// for遍历数组nums
for(let i =0;i<nums.length;i++)
{
// 对比map中的差值
const deff =target - nums[i];
if(map.has(deff)){
// 若存在,返回deff下标
return[map.get(deff),i]
// 这是什么写法?
}else{
// 若没有把num[i]当做key
// i当做value;调换了顺序,思考原因
map.set(nums[i],i)
}
}
return[]
};
分析:
js版关于i当value不是很懂;原始哈希表难到不是这样