- 博客(82)
- 收藏
- 关注
原创 LeetCode678.有效的括号字符串
题目链接: 点这里思路: 使用栈匹配法分析: 从左向右遍历, 如果碰到左括号, 放入左括号栈, 如果碰到星号, 那么放入星号栈, 由于星号可以是左括号, 右括号, 和空字符, 那么我们在碰到右括号时, 优先匹配左括号, 当左括号没有时, 那么可以匹配星号, 这里有个问题, 即如果星号是左括号, 那么其匹配的右括号应该为第一个, 而不是左括号用完后的哪一个右括号, 这里如果我们将星号看成左括号, 那么相当于我们调换了两个左括号的位置, 并不会影响结果, 所以可以使用这个方法class Solution
2021-09-12 10:06:51
181
原创 LeetCode502.IPO
思路: 贪心 + 大根堆分析: 首先我们只能选择capital小于w的, 这是一个查找问题, 对此可以想到二分查找, 因此可以先对capital进行排序, 并对Profits的位置进行更新, 之后根据w会一直增大, 那么我们可以使用大根堆, 将可以购买的项目放入堆中, 选出最大值即可class Solution {public: struct Node { int x, y; }; int binary_search(vector<Node> &
2021-09-10 22:08:06
175
原创 LeetCode.1894找到需要补充粉笔的学生编号
题目链接: 点这里思路: 前缀和 + 二分分析: 由于一轮学生使用粉笔的总数量是固定的, 可以对粉笔总数量先求模, 然后使用二分找到哪个使得粉笔刚好不够用class Solution {public: int chalkReplacer(vector<int>& chalk, int k) { vector<long long> v(chalk.size(), 0); v[0] = chalk[0]; for (
2021-09-10 13:19:56
190
原创 LeetCode68.文本左右对齐
题目链接: 点这里算法: 贪心尽量容纳下一个单词, 如果不行就下一行处理, 这题麻烦在格式的处理, 具体思路并不难class Solution {public: vector<string> fullJustify(vector<string>& words, int maxWidth) { vector<string> result; int word_num = 0; int word_len =
2021-09-09 22:26:37
148
原创 LeetCode767.重构字符串
题目链接:点这里思想: 贪心方法: 最大堆需要先对字符串做判断, 如果最多的字符超过总字符数的一半, 那么直接返回空字符串, 如果满足条件进入下一步使用最大堆, 堆的排序规则由字符的计数决定, 每次弹出两个最多的字符, 拼接, 如果弹出的字符没有用完, 那么计数减一在放回堆里面. 这样就能保证不会重复, 如果最后有一个字符没有弹出, 可以直接拼接.class Solution {public: string reorganizeString(string s) { int
2021-09-07 22:28:07
92
原创 LeetCode1221.分割平衡字符串
题目链接: 点这里使用方法: 贪心class Solution {public: int balancedStringSplit(string s) { int result = 0; int arr[128] = {0}; for (int i = 0; i < s.length(); i++) { arr[s[i]]++; // 如果发现平衡字符串, 立刻分割 if
2021-09-07 21:23:44
138
原创 LeetCode96.不同的二叉搜索树
链接: 点这里使用方法: 带备忘录的递归思路: 对于一个从1到n的节点, 其可以选择每个节点作为根节点, 共有n次选择, 左边的位于根节点的左边, 右边的位于根节点的右边, 这是左子树和右子树的情况判断与当前树一样, 所以可以递归求解, 当前树的结果为左子树的个数*右子树的个数, 由于从1到n和从2到n+1所能构造的搜索数的数量是一致的, 所以只需要以数组的范围为key, 情况个数为value记录即可class Solution {public: unordered_map<int,
2021-07-04 16:44:08
73
原创 LeetCode815.公交路线
题目链接:点这里图类问题: 已知某些点之间是连通的, 求从一个点到另一个点的最短跳转距离(这里通过公交车进行跳转), 如果两个点不连通, 那么返回-1解题步骤:有已知的出发站, 求得可以乘坐哪些车(这里需要个数据结构存放每个站由哪些车过, unordered_map<int, set>)根据这些车得知哪些站可以到达, 到达这些站, 并记录距离, 如果这个站已经到达过, 这不在记录(这里需要一个数据结构记录到这些站的距离unordered_map<int, int>)根据这
2021-06-29 17:04:12
122
原创 LeetCode279.完全平方数
题目链接:点这里使用方法: 动态规划这里假设F(0)到F(n - 1)均为最优答案, 那么F(n)=min(F(n),F(n−i2)+1),i2<nF(n)=min(F(n), F(n -i^2) + 1),i^2<nF(n)=min(F(n),F(n−i2)+1),i2<nclass Solution {public: int numSquares(int n) { if (n == 1) return 1; vector<int&
2021-06-11 18:49:17
96
原创 oj256.国王游戏
题目链接: 点这里使用方法: 微扰得到以上排序性质后, 编写排序方法, 对大臣进行排序即可#include <vector>#include <iostream>#include <algorithm>#include <string>#include <set>#include <queue>using namespace std;struct Node { int a, b;};int cmp(
2021-06-11 13:42:30
192
2
原创 LeetCode518.零钱兑换2
题目链接: 跳转使用方法: 动态规划递归方程: F(amount) = F(amount - coin);另外要注意这个问题是一个组合问题, 遍历硬币时不能从第0个硬币遍历, 需要从当前硬币遍历class Solution {public: int change(int amount, vector<int>& coins) { vector<int> v(amount + 1, 0); v[0] = 1; f
2021-06-10 20:22:55
61
原创 oj287.合并果子
题目链接: 点这里方法一(使用set):由于set基于红黑树实现, 本身是有序的, 所以可以通过begin()函数获得最小值, 在通过erase()消除已经取出最小值#include <vector>#include <iostream>#include <algorithm>#include <string>#include <set>using namespace std;// 使用pair防止set自动去重, second为
2021-06-10 13:50:47
129
原创 oj166.字符串操作1
题目链接: 点这里练习使用字符串的函数:length(), 与size(), 效果一样insert(pos, str): pos表示下标find(str)与rfind(str):str开头的下标#include <vector>#include <iostream>#include <algorithm>#include <string>using namespace std;int main() { string a, b;
2021-06-10 13:04:53
130
原创 oj245.货仓地址
题目链接: 点这里假设总距离为S地点为P, P的左边有a个商店, 右边有b个商店, 那么将S向右移1个单位, 那么距离更新为S + (a - b), 如果使S增大, 那么a > b, 因此将P不断右移, 当 a==b时, S达到最大值, 其实就是找到中位数即可#include <vector>#include <iostream>#include <algorithm>using namespace std;int main() { int n
2021-06-09 18:09:31
138
原创 LeetCode525.连续数组
题目链接: 连续数组使用方法: 前缀和数组+哈希化假设对于数组[i…j], pre[i]表示0到i中1的个数减去0的个数的值, 那么如果pre[j] - pre[i - 1] == 0, 那么说明i…j中0和1的数量相同,因此只需要用哈希表记录pre[i]的值即可class Solution {public: unordered_map<int, int> m; int findMaxLength(vector<int>& nums) {
2021-06-03 16:54:57
62
原创 LeetCode523.连续的子数组和
题目链接: 连续的子数组使用方法: 前缀和数组+哈希化因为有考虑所有的子树组, 可以使用前缀和+哈希来简化问题对于[i…j], 如果pre[j] - pre[i - 1] = k * n;那么pre[i - 1] = pre[j] - k * n, 只要存在满足条件的i, 那么返回true, 否则返回falseclass Solution {public: bool checkSubarraySum(vector<int>& nums, int k) {
2021-06-02 15:47:10
96
原创 LeetCode814.二叉树剪枝
题目: 二叉树剪枝由于树的结构就是递归定义的, 所以树的处理应想到递归算法如果是nullptr, 那么返回nullptr如果当前树不含1, 那么返回nullptr否则返回root/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nul
2021-06-01 18:55:43
124
原创 LeetCode1744.你能在你最喜欢的那天吃到你最喜欢的糖果吗?
题目链接: https://leetcode-cn.com/problems/can-you-eat-your-favorite-candy-on-your-favorite-day/使用前缀和数组:对于: 7 4 5 3 8前缀: 0 7 11 16 19 27最慢吃: 如果要吃到糖果0, 那么day不能操作6, 也就是每天只吃一个, 用七天吃完, 即if(pre[i + 1] <= day) return false;最快吃: 如果要在第0天吃到糖果2, 那么需要
2021-06-01 17:25:04
111
原创 LeetCode560和为K的子数组
题目链接: https://leetcode-cn.com/problems/subarray-sum-equals-k/使用方法: 前缀和数组以及哈希化使用前缀和保证性质: 对于[i…j], 如果满足和为K, 那么pre[j] = pre[i - 1] + k, 即pre[i - 1] = pre[j] - k当遍历到j时, 我们只需要知道有多少个i满足这个性质, 那么就要多少个以j结尾的子数组满足和为K, 因此引入哈希表用于保存i的状态class Solution {public: u
2021-05-31 16:55:01
56
原创 LeetCode第15天
LeetCode第231题: 2的幂如果是2的幂, 那么二进制应该只有一个1, 其余为零, 利用位运算即可判断class Solution: def isPowerOfTwo(self, n: int) -> bool: k = 0 while n > 0: k += n & 1 n = n >> 1 if k > 1: return False
2021-01-26 10:50:41
59
原创 LeetCode50题第14天
LeetCode第215题: 数组中的第K个最大元素先排序, 再寻找class Solution: def findKthLargest(self, nums: List[int], k: int) -> int: nums.sort() i = len(nums) - 1 while k > 1: i -= 1 k -= 1 return nums[i]LeetC
2021-01-25 13:34:54
45
原创 LeetCode50题的13天
LeetCode第160题: 相交链表先遍历A, 留下足迹, 再遍历B, 找出足迹# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def getIntersectionNode(self, headA: ListNode, headB: Li
2021-01-24 10:23:29
112
原创 LeetCode50题第12天
LeetCode第146题: 缓存机制使用队列存放(键被加入或改动的时间, 键值)使用字典存放{键: (键被加入或改动的时间, 值)}如果需要删除某个键, 使用队列依次出队, 如果出队的的时间与键值对对应字典的时间相同, 删除即可from queue import Queue import timeclass LRUCache: def __init__(self, capacity: int): self.size = capacity se
2021-01-23 10:47:34
48
原创 LeetCode50题第11天
LeetCode第136题: 只出现一次的数字由于其他的数字都会重复出现, 如果使用异或可以将其消除class Solution: def singleNumber(self, nums: List[int]) -> int: result = nums[0] for i in range(1, len(nums)): result ^= nums[i] return result复杂度分析: 假设长度为n,
2021-01-21 23:19:51
58
原创 LeetCode50题第10天
LeetCode第121题: 买卖股票的最佳时机使用动态规划对于商家只有两种状态, 要么买入股票, 要么没买入股票当买入股票时, 要么卖出股票, 要么保留当没买入股票时, 要么买入, 要么观望class Solution: def maxProfit(self, prices: List[int]) -> int: length = len(prices) if length < 2: return 0
2021-01-21 14:48:36
48
原创 LeetCode50题第九天
LeetCode第88题: 合并两个有序数组使用双指针法class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ mid = [] i = 0
2021-01-20 10:28:28
143
2
原创 LeetCode50题第8天
LeetCode第62题: 不同路径使用动态规划, 创建一个m行n列的数组, 第一行和第一列都标为一(如果数组只有一行或者一列, 返回1), 如果不是第一行或者第一列, 那么它的值就是它的左边加上他的上边. 返回值class Solution: def uniquePaths(self, m: int, n: int) -> int: if m <= 1 or n <= 1: return 1 array = []
2021-01-19 14:50:40
52
原创 LeetCode50题第7天
LeetCode第54题: 螺旋矩阵使用递归一圈一圈的加入到列表中class Solution: def spiralOrder(self, matrix): result = [] self.fun(matrix, 0, 0, len(matrix), len(matrix[0]), result) return result def fun(self, matrix, x: int, y: int, m: int, n: int,
2021-01-18 22:10:47
123
1
原创 LeetCode50题第六天
LeetCode第43题: 字符串相乘解法一使用python内置函数class Solution: def multiply(self, num1: str, num2: str) -> str: return str(int(num1) * int(num2))解法二采用常规算法, 逐位相乘, 最后处理进位class Solution: def multiply(self, num1: str, num2: str) -> str:
2021-01-17 14:51:21
49
原创 LeetCode50题第5天
LeetCode第23题: 合并K个升序链表解法一使用合并两个顺序链表的方法来合并k个链表class Solution: def mergeKLists(self, lists) -> ListNode: if len(lists) == 0: return None # print(len(lists)) i = 1 while i < len(lists): li
2021-01-15 16:42:58
54
原创 LeetCode50题第四天
LeetCode第16题: 最接近的三数之和思想与三数之和类似, 使用双指针方法class Solution: def threeSumClosest(self, nums, target): length = len(nums) nums.sort() print(nums) if target < nums[0] + nums[1] + nums[2]: return nums[0] + num
2021-01-14 09:53:42
63
原创 LeetCode50题第三天
LeetCode第11题: 盛水最多的容器思路: 容器的容量有两个因素决定: 间距和最小高度可以先保证某个变量为最大值, 寻找另一个变量的更大值, 以此来找到比现有容器更大的值这里保证间距始终为最大值, 如果存在容量更大的容器, 那么一定是在当前容器双指针的里边class Solution: def maxArea(self, height: List[int]) -> int: flag = False i = start = 0 j
2021-01-12 22:19:54
52
原创 LeetCode50题第2天
LeetCode第7题: 整数反转本题比较简单, 利用地板除和取模即可得出, 最后需要判断是否溢出class Solution: def reverse(self, x: int) -> int: i = 1 if x < 0: i = -1 x = -x mid = 0 while x > 0: mid = mid * 10 + x %
2021-01-12 10:02:20
69
原创 LeetCode50题第一天
LeetCode第2题: 两数相加算法思路:由于链表是从低位到高位, 我们可以逐位相加, 某一位为(l1.val + l2.val) % 10由于存在进位问题, 需要设置一个变量作为进位, 其值为(l1.val + l2.val) // 10如果在中途某个链表到头了, 那么就可以推出第一层循环, 循环单独的链表即可(这里可以使用将None补零, 来简化代码, 但是算法的复杂度并未简化)# Definition for singly-linked list.# class ListNode(o
2021-01-12 00:08:00
67
原创 LeetCode第5题: 寻找最长回文子串
解法一:这个解法是我以前的代码, 具体思路如下从最长字符开始寻找, 往短的方向寻找, 这样如果找到即可返回, 如果从最短开始, 由于不知道是否是最大的, 那么继续寻找class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ if s == "": return ""
2021-01-11 23:57:21
114
原创 LeetCode第4题:寻找两个有序数组的中位数C语言实现
解法一先找到两个数组的长度, 然后遍历找到中位数即可如果是奇数个, 那么就直接返回, 如果是偶数个, 那么就返回它与它前一个树的和的平均数double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){ int target = (nums1Size + nums2Size) >> 1; int i, j, pre, res;// pre记录res前边的一个数, re
2021-01-11 15:30:19
306
原创 LeetCode第2题: 两数相加python实现
算法思路:由于链表是从低位到高位, 我们可以逐位相加, 某一位为(l1.val + l2.val) % 10由于存在进位问题, 需要设置一个变量作为进位, 其值为(l1.val + l2.val) // 10如果在中途某个链表到头了, 那么就可以推出第一层循环, 循环单独的链表即可(这里可以使用将None补零, 来简化代码, 但是算法的复杂度并未简化)# Definition for singly-linked list.# class ListNode(object):# def
2021-01-11 09:44:40
243
原创 文件与文件系统
文件与文件系统打开文件open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)file: 必须, 文件路径mode: 可选, 默认为只读模式buffering: 设置缓冲encoding: 解码方式error: 错误级别newline: 区分换行符常见mode‘r’ 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。‘w’打开一个文件
2020-08-08 22:15:40
64
原创 datetime模块
datetime模块datetime 是 Python 中处理日期的标准模块,它提供了 4 种对日期和时间进行处理的类:datetime、date、time 和 timedelta。1. datetimedatetime.now(tz=None): 获取当前日期时间datetime.timestamp(): 获取以1970年1月1日为起点的秒数datetime.fromtimestamp(tz=None): 使用unixtimestamp创建一个datetimedatetime.strftim
2020-08-07 21:43:12
405
原创 模块
模块模块的定义模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 Python 标准库的方法。命名空间内置命名空间: python运行时, 内置命名空间就已经存在, 例如内置函数, 可以直接使用全局命名空间: 模块里的空间, 每个模块相互独立本地命名空间: 类与函数里的局部空间, 随着类与函数的结束而结束导入模块语法:# 方式1, 使用时需要写全名, 模块名.名称import 模块名# 方式2, 使用时写名
2020-08-07 21:36:54
107
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人