一、学习新题
1、爬楼梯
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?(1<=n<=45)
class Solution {
public:
int climbStairs(int n) {
int p=0,q=0,r=1;
for(int i=1;i<=n;i++){
p=q;
q=r;
r=p+q;
}
return r;
}
};
看了动态规划的视频讲解,知道和斐波那契数列大差不差,但还是不太懂。
2、删除链表中的重复元素
给定一个已排序的链表的头节点 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
//判断头节点(当前链表)是否为空
if(head==nullptr){
cout<<"当前链表为空,无法删除"<<endl;
return head;
}
//重开一个指针cur来代替head
//因为head是链表的起始地址,链表头要固定,如果不新开一个,最后将无法找到链表的起始地址并返回
ListNode* cur=head;
while(cur->next){
//判断是否到链表最后
if(cur->next==nullptr){
break;
}
if(cur->next->val==cur->val){
cur->next=cur->next->next;
}else{
//如果没有找到重复的,就将cur后移
cur=cur->next;
}
}
return head;
}
};
看到这道题有了一点点的思路,联想到了昨天刚复习的删除有序数组中的重复项这道题以及之前看的尚硅谷老师java数据结构与算法中对单链表的增删改查那一部分内容。然后我就参考这两部分内容写,但是还是写不出来,于是就又开始看着题解写了。
二、复习旧题
1、x的平方根
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
class Solution {
public:
int mySqrt(int x) {
int left=0,right=x,ans=0;
while(left<=right){
int mid=left+(right-left)/2;
if((long long)mid*mid<=x){
ans=mid;
left=mid+1;
}else{
right=mid-1;
}
}
return ans;
}
};