随笔分类 -  leetcode / leetcode高频题

摘要:题目链接 解题思路:快排中的一部分,等于1的放中间,等于0的放左边,等于2的放右边 代码 class Solution: def sortColors(self, nums: List[int]) -> None: left_border = -1 right_border = len(nums) 阅读全文
posted @ 2024-12-24 09:42 ouyangxx 阅读(7) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:如何原地,是困难点。我们可以使用原有的矩阵,来存放某些信息。原来的矩阵第一行,matrix[0][i]如果等于0,代表第i列有0,原来的矩阵第一列,matrix[i][0]如果等于0,代表第i列有0。还有一个注意点,就是matrix[0][0]代表什么?这是一个歧义的点,所以不存 阅读全文
posted @ 2024-12-22 21:07 ouyangxx 阅读(7) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:递推公式就是F(n) = F(n - 2) + F(n - 2) 代码 class Solution: def climbStairs(self, n: int) -> int: # 递推公式就是F(n) = F(n - 1) + F(n - 2) if n == 1: retu 阅读全文
posted @ 2024-12-22 19:58 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:直接暴力找,但是使用二分法暴力找 代码 class Solution: def mySqrt(self, x: int) -> int: # 二分法暴力找 L = 0 R = x ans = -1 while L <= R : mid = (R + L) // 2 if mid 阅读全文
posted @ 2024-12-22 19:55 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:从后往前遍历,模拟即可 代码 class Solution: def plusOne(self, digits: List[int]) -> List[int]: # 直接在原数组上改 carry = 1 for i in range(len(digits) - 1, -1, - 阅读全文
posted @ 2024-12-22 19:51 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:数学题,一共要走m + n - 2步,选择其中的n - 1往右走,或者选择其中的m - 1往下走,就是C(n-1)/(n+m-2) 代码 class Solution: def uniquePaths(self, m: int, n: int) -> int: # 计算C(m - 阅读全文
posted @ 2024-12-22 19:41 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:按照第一维度排序,然后依次遍历,假设现在遍历到i,[begin1, end1],然后i+1是[begin2, end],如果begin2 <= end1,那么二者可以合并成[begin1, max(end1, end2)],因为按照第一维度排序的,所以开头是begin1,结尾注意 阅读全文
posted @ 2024-12-22 19:33 ouyangxx 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:初始能够到达最远的位置max_index是nums[0],然后我们就依次遍历i <= nums[0],然后途中不断更新max_index,如果更新到某一时刻,到达了最后一个下标,返回true,如果「走不动」了,那么就返回false 代码 class Solution: def c 阅读全文
posted @ 2024-12-22 15:49 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:宏观思路,一圈一圈打,确定好「一圈」的左上角以及右下角,然后再打印。有两种特殊情况,左上角和右上角的列相等时,只需要打一行即可;左上角的列和右下角的列相等时,只需打印一列即可。 代码: from typing import List class Solution: def spi 阅读全文
posted @ 2024-12-22 15:22 ouyangxx 阅读(10) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:子数组问题,考虑以i结尾,或者以i开头结果怎么样。本题,以i开头结果是如何?从后往前遍历,假设i+1的结果大于0,为x,那么,求i时,结果就是nums[i] + x,如果x小于0,那么结果就是nums[i] 代码 class Solution: def maxSubArray(s 阅读全文
posted @ 2024-12-20 17:16 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路: 方法一:每个「字母异位词」,排序后的结果,都是一致的,所以,可以用一个map,key就是排序后的字符串,value就是所有的「字母异位词」。 方法二:直接使用map,不需要排序得出来,看下面的代码 class Solution { public: struct MyCompar 阅读全文
posted @ 2024-12-20 16:53 ouyangxx 阅读(12) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:要有宏观的思路,策略是一圈一圈的转换。然后每一圈,又分成一个一个的小组进行转换,见下图 代码 class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); fo 阅读全文
posted @ 2024-12-20 11:32 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:采取填数的方式,来到0下标,哪个数放在0下标?一个for循环,[0...]都可以放0下标。0下标填完之后,后续的操作不再处理0下标的,也就是说,哪个数放1下标?一个for循环,[1...]都可以放1下标(注意,不能动0下标的数了)。 代码 class Solution { pub 阅读全文
posted @ 2024-12-20 10:50 ouyangxx 阅读(7) 评论(0) 推荐(0) 编辑
摘要:题目链接 思路和之前一个题类似,链接 代码 class Solution { public: bool process(string &s, string &p, int i, int j, vector<vector<int>> &dp) { if (i == s.length() && j == 阅读全文
posted @ 2024-12-19 11:02 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:单独算i位置的雨水。i位置雨水是多少?max(0, min(左边最大值,右边最大值) - i的值)。关键就是得到min(左边最大值,右边最大值)。 我们先用一个指针left,指向最左,代表左边的最大值,一个指针right,指向最右,代表右边的最大值。 如果left < right 阅读全文
posted @ 2024-12-19 10:40 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:整体思路就是,我们先假想,[0, n - 1]上,放满了1~n,所以,我们缺失的第一个正数就是n+1。也就是说,i下标,放的数字是i+1。那么我们从左往右遍历的过程中,就尽量满足这种情况 1️⃣如果nums[i] == i + 1,直接跳过,啥都不管 2️⃣如果nums[i] < 阅读全文
posted @ 2024-12-19 10:24 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:就是一个递归。弄清楚题目意思,n=1时,就返回1,然后n=2时,返回上一个结果,上一个结果是一个1,所以就是11,然后n=3,返回上一个结果,就是两个1,所以就是21 代码 class Solution { public: string countAndSay(int n) { 阅读全文
posted @ 2024-12-18 17:34 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:整体思路是一个回溯,一行一行填。然后填的过程中可以剪枝,也就是我们可以添加一些约束条件,不能填的时候,就没必要去尝试了(还有一种填法,全部填完之后,再检查是否合规,这样复杂度太大了)。具体细节看代码。 代码 class Solution { public: // 0~8行,0~8 阅读全文
posted @ 2024-12-18 17:13 ouyangxx 阅读(9) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:整体框架就是二分,只是找到了target后,还要继续查找。分两次查找,第一次是「找到等于target最左的位置」,第二次是「找到等于target最右的位置」 代码 class Solution { public: vector<int> searchRange(vector<in 阅读全文
posted @ 2024-12-18 14:53 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:题目意思是,把原来的有序数组分成两半,左边的放右边来,右边的放左边去,然后数组中是否存在target这个数,存在则返回其下标。 要求时间复杂度O(logn) 整体的框架还是二分查找,但是在查找过程中,我们总能得到「一边」是有序的,例如在整体[L, R]上,划分成两半是[L, x] 阅读全文
posted @ 2024-12-18 14:33 ouyangxx 阅读(7) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示