爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
解题思路:
动态规划,用f(x)表示爬到第 x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,得出:
f(x)=f(x-1)+f(x-2)
代码:var climbStairs = function(n) { if(n == 1){ return 1; } if(n == 2){ return 2; } let a = 1; let b = 2; for(let i = 3;i <= n;i++){ [a,b] = [b,a+b]; } return b; };
删除排序链表中的重复元素
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例1:
输入:head = [1,1,2]
输出:[1,2]
解题思路:
1.一次遍历:由于给定的链表是排好序的,重复的元素在链表中的位置肯决定是连续的,只需要对链表遍历一次就可以把重复的元素删除。
指针cur指向链表的头节点,对链表进行遍历,如果当前 cur 与 cur.next 对应的元素相同,那么我们就将 cur.next 从链表中移除;
细节:当我们遍历到链表的最后一个节点时,cur.next 为空节点,如果不加以判断,访问 cur.next 对应的元素会产生运行错误。因此我们只需要遍历到链表的最后一个节点,而不需要遍历完整个链表。
代码:
var deleteDuplicates = function(head) {
if(head == null){
return null;
}
var cur = head;
while(cur.next){
if(cur.val == cur.next.val){
cur.next = cur.next.next
}else{
cur = cur.next
}
}
return head
};