自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 LeetCode678.有效的括号字符串

题目链接: 点这里思路: 使用栈匹配法分析: 从左向右遍历, 如果碰到左括号, 放入左括号栈, 如果碰到星号, 那么放入星号栈, 由于星号可以是左括号, 右括号, 和空字符, 那么我们在碰到右括号时, 优先匹配左括号, 当左括号没有时, 那么可以匹配星号, 这里有个问题, 即如果星号是左括号, 那么其匹配的右括号应该为第一个, 而不是左括号用完后的哪一个右括号, 这里如果我们将星号看成左括号, 那么相当于我们调换了两个左括号的位置, 并不会影响结果, 所以可以使用这个方法class Solution

2021-09-12 10:06:51 76

原创 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 79

原创 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 80

原创 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 61

原创 LeetCode767.重构字符串

题目链接:点这里思想: 贪心方法: 最大堆需要先对字符串做判断, 如果最多的字符超过总字符数的一半, 那么直接返回空字符串, 如果满足条件进入下一步使用最大堆, 堆的排序规则由字符的计数决定, 每次弹出两个最多的字符, 拼接, 如果弹出的字符没有用完, 那么计数减一在放回堆里面. 这样就能保证不会重复, 如果最后有一个字符没有弹出, 可以直接拼接.class Solution {public: string reorganizeString(string s) { int

2021-09-07 22:28:07 50

原创 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 67

原创 LeetCode96.不同的二叉搜索树

链接: 点这里使用方法: 带备忘录的递归思路: 对于一个从1到n的节点, 其可以选择每个节点作为根节点, 共有n次选择, 左边的位于根节点的左边, 右边的位于根节点的右边, 这是左子树和右子树的情况判断与当前树一样, 所以可以递归求解, 当前树的结果为左子树的个数*右子树的个数, 由于从1到n和从2到n+1所能构造的搜索数的数量是一致的, 所以只需要以数组的范围为key, 情况个数为value记录即可class Solution {public: unordered_map<int,

2021-07-04 16:44:08 45

原创 LeetCode815.公交路线

题目链接:点这里图类问题: 已知某些点之间是连通的, 求从一个点到另一个点的最短跳转距离(这里通过公交车进行跳转), 如果两个点不连通, 那么返回-1解题步骤:有已知的出发站, 求得可以乘坐哪些车(这里需要个数据结构存放每个站由哪些车过, unordered_map<int, set>)根据这些车得知哪些站可以到达, 到达这些站, 并记录距离, 如果这个站已经到达过, 这不在记录(这里需要一个数据结构记录到这些站的距离unordered_map<int, int>)根据这

2021-06-29 17:04:12 75

原创 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 68

原创 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 112 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 34

原创 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 88

原创 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 91

原创 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 111

原创 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 35

原创 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 55

原创 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 47

原创 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 66

原创 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 33

原创 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 37

原创 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 29

原创 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 48

原创 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 27

原创 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 39

原创 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 32

原创 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 73 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 36

原创 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 73 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 35

原创 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 38

原创 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 49

原创 LeetCode50题第三天

LeetCode第11题: 盛水最多的容器思路: 容器的容量有两个因素决定: 间距和最小高度可以先保证某个变量为最大值, 寻找另一个变量的更大值, 以此来找到比现有容器更大的值这里保证间距始终为最大值, 如果存在容量更大的容器, 那么一定是在当前容器双指针的里边class Solution: def maxArea(self, height: List[int]) -> int: flag = False i = start = 0 j

2021-01-12 22:19:54 35

原创 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 45

原创 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 50

原创 LeetCode第5题: 寻找最长回文子串

解法一:这个解法是我以前的代码, 具体思路如下从最长字符开始寻找, 往短的方向寻找, 这样如果找到即可返回, 如果从最短开始, 由于不知道是否是最大的, 那么继续寻找class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ if s == "": return ""

2021-01-11 23:57:21 84

原创 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 214

原创 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 149

原创 文件与文件系统

文件与文件系统打开文件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 42

原创 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 272

原创 模块

模块模块的定义模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 Python 标准库的方法。命名空间内置命名空间: python运行时, 内置命名空间就已经存在, 例如内置函数, 可以直接使用全局命名空间: 模块里的空间, 每个模块相互独立本地命名空间: 类与函数里的局部空间, 随着类与函数的结束而结束导入模块语法:# 方式1, 使用时需要写全名, 模块名.名称import 模块名# 方式2, 使用时写名

2020-08-07 21:36:54 85

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除