1.两数之和
? ? ? ?1.1 自己所写方法(暴力枚举)
let result = [];
for(let i = 0; i < nums.length; i++){
for(let j = i + 1; j < nums.length; j++){
if(nums[i] + nums[j] == target){
result.push(i);
result.push(j)
}
}
}
return result;
? ? ? ? ?1.2 别人的方法(ES6中的map方法):
? ? ? ? ? ? ? ? ? ? ? Map对象保存键值对,任何值都可以作为一个键或一个值。这里需要注意Object中虽然也可以保存键值对,但是Object中的对象只能是字符串或者Symbol,而Map中的键可以是函数,对象或者基本类型。
? ? ? ? ? ? ? ? ? ? ? ? Map.prototype.has(key):?返回一个布尔值,表示Map实例是否包含键对应的值
? ? ? ? ? ? ? ? ? ? ? ? Map.prototype.get(key):返回指定键的值,如果不存在返回undefined
let map = new Map();
for(let i = 0; i < nums.length; i++){
x = target - nums[i];
if(map.has(x)){
return [map.get(x),i]
}
map.set(nums[i],i);
}
? ? ? ? map.set() 不可以放在if语句前面 会有错误!
2. 两数相加
? ? ? ? 补充知识:NodeList是一种类数组对象,用于保存一组有序的节点,可以通过方括号来访问NodeList的值,它有item()方法与length属性,没有数组对象的方法
let head = null, tail = null;
let carry = 0;
while(l1 || l2){
const n1 = l1?l1.val : 0;
const n2 = l2?l2.val : 0;
const sum = n1 + n2 + carry;
if(!head){
head = tail = new ListNode(sum % 10);
}else{
tail.next = new ListNode(sum % 10);
tail = tail.next;
}
carry = Math.floor(sum/10)
if(l1){
l1 = l1.next
}
if(l2){
l2 = l2.next
}
}
if(carry > 0){
tail.next = new ListNode(carry)
}
return head
对上述代码的理解:先创建一个新的链表head 将l1与l2的第一个元素相加 作为head,tail的第一个元素,注意这里head 与 tail 用的应该是赋址,然后tail.next 指向下一个元素 将计算后的结果作为head第二个元素。
3.零钱兑换
? 这是一个 背包(DP)问题,给定一个背包容量target,再给定一个数组nums(物品),能否按一定方式选取nums中的元素得到target,可以分几种情况
? ? ? ? 0/1背包问题(每个元素最多选一次)、 完全背包问题(每个元素可以重复选择)、组合背包问题(背包中的物品要考虑顺序)、分组背包问题(不止一个背包,需要遍历每个背包)
let dp = new Array(amount + 1 ).fill(Infinity);
dp[0]=0;
for(let i = 1;i <= amount; i++){
for(let coin of coins){
if(i - coin >= 0){
dp[i] = Math.min(dp[i],dp[i - coin]+1)
}
}
}
return dp[amount] === Infinity?-1:dp[amount]
|