LeetCode笔记(链表中点和反转,旋转图形)

198. 打家劫舍 - easy

在这里插入图片描述

经典动态规划中选不选问题

//13.01
//13.06
class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.empty()) return 0;
        if(nums.size() == 1) return nums[0];
        //if(nums.size() == 2) return max(nums[0], nums[1]);

        vector<int> ans(nums.size(), 0);
        ans[0] = nums[0];
        ans[1] = max(nums[0], nums[1]);
        for(int i = 2; i < nums.size(); i++) {
            ans[i] = max(ans[i-1], ans[i-2]+nums[i]);
        }

        return ans.back();
    }
};

234. 回文链表* - easy

在这里插入图片描述

自己的方法比较复杂,先找到list的中点,从中间开始反转list,之后同时从头往中点遍历以及从末尾往中间遍历,若每次他们的val都相同则为回文链表,但用时长,虽然应该也是时间O(n),空间O(1)

看完答案后发现我的思路是对的,一摸一样,而且代码也差不多,看来之所以慢是因为我的reverse是函数,函数调用花费了时间(这算是复习了找链表中点和反转链表)

//17.25
//17.49
class Solution {
    void reverse(ListNode* &head) {  //反转列表
        if(head == nullptr) return ;
        if(head->next == nullptr) return ;

        ListNode* pre = head;
        ListNode* cur = pre->next;
        ListNode* nex = cur->next;
        pre->next = nullptr;		//反转列表的最后一个指向nullptr
        while(cur != nullptr) {
            cur->next = pre;
            pre = cur;
            cur = nex;
            if(nex != nullptr) nex = nex->next;
        }
        head = pre;					//head成为反转列表的head
    }
public:
    bool isPalindrome(ListNode* head) {
        ListNode* slow = head, *fast = head;
        while(fast != nullptr) {	//找到列表的中点,用slow记录
            slow = slow->next;
            fast = fast->next;
            if(fast) fast = fast->next;
        }
        reverse(slow);				//从中点开始反转
        while(slow != nullptr && head != nullptr) {
            if(slow->val != head->val) return 0;
            else {
                slow = slow->next;
                head = head->next;
            }
        }
        return 1;
    }
};

141. 环形链表 - easy

在这里插入图片描述
一开始以为不仅要判断还要找出循环点,后来才发现只要判断即可,瞬间变简单了

//18.13
//18.20
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == nullptr) return 0;

        ListNode *slow, *fast;
        slow = fast = head;

        do{
            slow = slow->next;
            fast = fast->next;
            if(fast != nullptr) fast = fast->next;
        }while(fast != slow && fast != nullptr);

        if(nullptr == fast) return 0;
        else return 1;
    }
};

48. 旋转图像* - medium

在这里插入图片描述
没做出来,根据答案可以发现规律:转置(沿对角线交换)+镜像(反转数组)

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        for(int i = 0; i < matrix.size(); i++) {
            for(int k = 0; k < i; k++) {
                swap(matrix[i][k], matrix[k][i]);
            }
        }
        for(int i = 0; i < matrix.size(); i++) {
            for(int k = 0; k < matrix.size()/2; k++) {
                swap(matrix[i][k], matrix[i][matrix.size()-k-1]);
            }
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值