No70.爬楼梯
1.题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
3.
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
4. 1 阶 + 1 阶 + 1 阶
5. 1 阶 + 2 阶
6. 2 阶 + 1 阶
2.算法思路
不难发现楼梯阶数与方法数的关系满足费布拉切数列
楼梯阶数1 2 3 4 5 ...
方法数 1 2 3 5 8 ...
3.算法代码
class Solution {
public int climbStairs(int n) {
if(n <= 3){
return n;
}
int result = 0;
int ll = 2; //左左节点
int l=3; //左节点
for(int i=3;i<n;i++){
result = ll+l;
ll = l;
l = result;
}
return result;
}
}
No83.删除排序链表中的重复元素
1.题目
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
2.算法思路
每次冲链表中拿到头元素,然后和它后面的一个元素(如果有的话)比较。
- 若头元素的值和它后一个元素的值相等,则把它后面的那个节点删除(temp.next = temp.next.next)
- 若不相等,则继续判断链表的下一个节点。
3.算法代码
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode temp = head;
while(temp != null && temp.next != null){ //后面一个节点要存在
if(temp.val == temp.next.val){ //步骤1:相等的情况
temp.next = temp.next.next;
}else{ //步骤2:不相等的情况
temp = temp.next;
}
}
return head;
}
}