leetcode
飞柴。
分享自己吃灰的笔记
展开
-
LeetCode 剑指 Offer 13. 机器人的运动范围(广搜和递推,C++)
剑指 Offer 13. 机器人的运动范围题目链接这道题可以简化一下,只剩下从(0,0)开始向下和向右走。二维图扫描可以考虑用广搜或深搜。这里给出广搜以及由广搜的思想引起的另一种方法。C++:class Solution {public: static int get(int x) { int sum = 0; while(x) { sum +=x%10; x = x/10;原创 2020-12-02 20:36:09 · 214 阅读 · 2 评论 -
LeetCode 剑指 Offer 12. 矩阵中的路径(深度优先搜索做二维平面扫描)
题目链接C++:class Solution {public: vector<vector<int>> direc; vector<vector<bool>> visited; vector<vector<char>> board; string word; int n, m, wlen; bool DFS(int i, int j, int start) {原创 2020-12-01 21:08:38 · 201 阅读 · 0 评论 -
LeetCode 剑指 Offer 11. 旋转数组的最小数字(二分法,C++)
题目链接C++:class Solution {public: int minArray(vector<int>& numbers) { int left = 0, right = numbers.size()-1; int mid = 0; while(left < right) { mid = left+(right-left)/2;原创 2020-11-30 23:05:52 · 203 阅读 · 0 评论 -
LeetCode 剑指 Offer 09. 用两个栈实现队列(C++)
剑指 Offer 09. 用两个栈实现队列题目链接a,b两个栈实现队列,a栈负责入队,b栈负责出队,做这道题相当于把两个栈的尾部相连接,为了避免频繁的入栈出栈,等出队的栈为空时,再把a栈中的数据倒进b。具体实现如下:class CQueue {public: stack<int> s1, s2; CQueue() { while (!s1.empty()) { s1.pop(); } while原创 2020-11-29 17:44:28 · 252 阅读 · 0 评论 -
LeetCode 剑指 Offer 07. 重建二叉树(不递归不知道C++传vector多么浪费时间)
剑指 Offer 07. 重建二叉树题目链接前序遍历:根节点->左子树->右子树中序遍历:左子树->根节点->右子树前序遍历的第一个节点是根节点,然后根据根节点在中序遍历数组中的位置,该位置左边是左子树的节点数量,该位置右边是右子树的节点数量。C++:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr原创 2020-11-28 23:34:47 · 292 阅读 · 1 评论 -
LeetCode 99. 恢复二叉搜索树(深度优先搜索,C++)
99. 恢复二叉搜索树题目链接由于二叉搜索树中序遍历是一个递增且有序,因此可以根据这个特性确定两个错误节点。C++:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} *原创 2020-11-27 22:50:04 · 268 阅读 · 0 评论 -
LeetCode 剑指 Offer 04. 二维数组中的查找(二叉搜索树,C++和python)
剑指 Offer 04. 二维数组中的查找题目链接从右上角观察数组,发现数组和二叉搜索树类似。因此可以这么做,右上角的值和target比较,如果大于target,行加1,如果小于target,列减1。C++:class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { int width = matrix.size();原创 2020-11-26 22:13:52 · 236 阅读 · 0 评论 -
LeetCode 22. 括号生成(回溯和动态规划两种方法,C++,python)
22. 括号生成题目链接看到组合两个字,想到组合题常用方法回溯。C++:class Solution {public: vector<string> generateParenthesis(int n) { if(n==0) return {}; if(n ==1) return {"()"}; vector<string> result; traceback(result,{},n,0,0,0);原创 2020-11-25 22:31:35 · 485 阅读 · 2 评论 -
LeetCode 21. 合并两个有序链表(双指针,C++和python)
21. 合并两个有序链表题目链接这道题属于简单题,但是容易想复杂,实际上类似双指针。如果l1.val<l2.val时,答案添加l1如果l1.val>l2.val时,答案添加l2C++循环:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {}原创 2020-11-24 23:01:47 · 233 阅读 · 0 评论 -
LeetCode 16. 最接近的三数之和(排序后双指针, C++和python)
16. 最接近的三数之和题目链接这道题和三数之和类似,排序后,用两个指针向中间逼近,如果大于结果就second-1,如果小于first-1。C++:class Solution {public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); int n = nums.size(); int ans原创 2020-11-23 21:50:47 · 239 阅读 · 1 评论 -
LeetCode 19. 删除链表的倒数第N个节点(双指针,C++和python)
19. 删除链表的倒数第N个节点题目链接链表倒数第N个节点是经典双指针题目,让两个指针保持n个间距,然后同步向后移动,当后面的指针会指向空时,此时前面的指针刚好在n位置。C++:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode原创 2020-11-23 19:44:18 · 212 阅读 · 0 评论 -
LeetCode 11. 盛最多水的容器(双指针,C++和python)
11. 盛最多水的容器题目链接这道题暴力求解时间复杂度为O(N2), 提交会超时。实际上如果做题熟练看到此题需要数组中的两个值,可以很快想到用双指针,双指针是此题目前的最优解法。C++:class Solution {public: int maxArea(vector<int>& height) { int max = 0; int left = 0, right = height.size()-1; while(原创 2020-11-23 19:11:24 · 246 阅读 · 0 评论 -
LeetCode 剑指 Offer 24. 反转链表(两种写法)
剑指 Offer 24. 反转链表题目链接方法一:翻转当前节点的后一个节点指向/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(Lis原创 2020-11-22 20:02:39 · 994 阅读 · 8 评论 -
LeetCode 14. 最长公共前缀(横向扫描,C++和python)
14. 最长公共前缀题目链接这道题点击去之后发现是两年前刷的了,好像是我刷的第一道力扣题,试了下自己现在写的代码比以前好多了,思路也更加清晰了。C++:class Solution {public: string longestCommonPrefix(vector<string>& strs) { if(strs.size() == 0) return ""; string ans; for(int j = 0; j原创 2020-11-22 15:40:01 · 243 阅读 · 0 评论 -
LeetCode 12. 整数转罗马数字(贪心, C++和python)
12. 整数转罗马数字题目链接这道题力扣题解上面给出了很多解法,贪心是目前逻辑最简单且效率高的。先把最大值1000替换,替换完成再替换900,以此类推……C++:class Solution {public: string intToRoman(int num) { vector<int> key = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; vector<stri原创 2020-11-22 14:22:17 · 240 阅读 · 2 评论 -
LeetCode 剑指 Offer 03. 数组中重复的数字(使value == index,python版本)
剑指 Offer 03. 数组中重复的数字题目链接这道题看到重复两个字一半想到用哈希,等等,0~n-1?那如果不存在重复元素的且有序的话则index==value,因此可以交换value和index,让其归位(value == index),如果拿到一个value(这个值的index不等于value),发现value下标对应的位置已经归位,则这个value重复。如下动图所示:*注:博主用ppt制作python代码如下:class Solution: def findRepeatNum原创 2020-11-21 22:25:36 · 199 阅读 · 0 评论 -
LeetCode 9. 回文数( 翻转一半比较相等,python版本)
9. 回文数题目链接题目要求不转为字符串,因此可以翻转一半数字和其对比,力扣官方讲解已经通俗易懂了,我不再多说什么:官方题解但是官方没有python版本,这里给出python版本:class Solution: def isPalindrome(self, x: int) -> bool: if x < 0 or x%10 == 0 and x != 0: return False #处理特殊数据 temp = 0原创 2020-11-21 20:46:40 · 227 阅读 · 0 评论 -
LeetCode 剑指 Offer 06. 从尾到头打印链表(递归和栈,C++和python)
剑指 Offer 06. 从尾到头打印链表题目链接这道题看到逆序打印,可以很快想到用递归,递归使用系统内存中的栈,不断调用函数速度有点慢,自己用栈保存是更快的。python版本:# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def rec原创 2020-11-21 19:40:46 · 209 阅读 · 0 评论 -
LeetCode 6.Z 字形变换(简单模拟和按列访问,C++和python)
6. Z 字形变换题目链接这道题直接简单模拟,先放进一个二维数组然后按行访问数组即可。官方题解:用的按行排序和按行访问由于官方没有python版本,我这里给出官方题解的python版本 简单模拟方法:class Solution {public: string convert(string s, int numRows) { if(numRows == 1) return s; vector<vector<char>&g原创 2020-11-20 23:47:07 · 201 阅读 · 0 评论 -
LeetCode 4. 寻找两个正序数组的中位数(优先队列和二分,C++)
4. 寻找两个正序数组的中位数(优先队列解法)题目链接这道题要求了时间复杂度为O(log(m+n)),根据对数时间复杂度,可以想到用二分法。由于我没能用二分法做出,这里引用力扣官方给的算法讲解力扣官方题解看到官方题解中通过二分法找Kth元素,想到topK问题可以用优先队列来做,试了下也可以通过。class Solution {public: double findMedianSortedArrays(vector<int>& nums1, vector<i原创 2020-11-19 22:07:45 · 271 阅读 · 0 评论 -
LeetCode 3. 无重复字符的最长子串(哈希表与滑动窗口,C++和python)
3. 无重复字符的最长子串题目链接这道题看到无重复最先想到哈希表,能提交过但是时间有点多。注意到只求出长度就可以,可以采用滑动窗口(也可以理解为双指针的一种妙用)。C++哈希表:class Solution {public: int lengthOfLongestSubstring(string s) { unordered_set<char> set; int left = 0; int max_len = 0;原创 2020-11-18 22:22:29 · 245 阅读 · 0 评论 -
LeetCode 2. 两数相加(c++和python)
2. 两数相加题目链接这道题可以采用递归也可以采用循环的方式解答由于有进位,使用一个变量记录当链表到达尽头,另一条的链表不一定到达尽头,进位也未必为0,这里采用三目运算符进行处理。C++版本:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} *原创 2020-11-18 21:32:59 · 260 阅读 · 0 评论 -
LeetCode 1. 两数之和(值和目录交换,目前不超时的C++和python解法)
1.两数之和题目链接方法一:直接暴力求解和暴力找差值(力扣数据已经增加,目前已经不能通过)方法二:哈希map//直接暴力求解容易想到,但是查找差值会更快一些。class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); for (int i = 0; i < n; ++i) {原创 2020-11-16 23:33:59 · 166 阅读 · 1 评论