如题目>▽<
零钱兑换(lc)
链接:
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array//
思路:
dp, 当前i面额能拼出的最小值为之前i-所有面值+1中最小的那个,0元可以0次拼出f[0]=0,其余全初始化为正无穷,意义为拼不出来
1 | int coinChange(vector<int>& coins, int amount) { |
游戏中弱角色的数量(lc)
链接:
https://leetcode-cn.com/problems/the-number-of-weak-characters-in-the-game/
思路:
由于我们需要计算弱角色的数量,所以应当先把其中一个属性降序排下序,以供防御力的比较。由于我们想要顺序遍历,记录防御力最大值,所以遍历的时候前面的防御力不应当大于后面的,因此防御力需要升序排序
1 | int numberOfWeakCharacters(vector<vector<int>>& A) { |
不同路径(lc)
链接:
https://leetcode-cn.com/problems/unique-paths/
思路:
最后一步取决于左边和上边的值的和,左边界和上边界全为1,
1 | int uniquePaths(int m, int n) { |
跳跃游戏(lc)
链接:
https://leetcode-cn.com/problems/unique-paths/
思路:
最后一步取决于之前能否跳过来,如果之前本身能跳过来,并且之前的位置加上对应的大小能跳过来就标记为ture
1 | bool canJump(vector<int>& nums) { |
分割平衡字符串(lc)
链接:
https://leetcode-cn.com/problems/split-a-string-in-balanced-strings/
思路:
贪心,平衡就记录
1 | int balancedStringSplit(string s) { |
解码方法(lc)
链接:
https://leetcode-cn.com/problems/decode-ways/
思路:
动态规划,前i个字符串的解码方法为前i-1个字符串的解码方法(第i-1个字符满足19)加上前i-2个字符串的解码方法(第i-1,i-2个字符组成的数字在1026之间)
1 | int balancedStringSplit(string s) { |
最长上升连续子序列(lc)
链接:
https://www.lintcode.com/problem/397/
思路:
动态规划,每相邻两个数递增就让dp[i]=dp[i-1]+1,如果不递增,则设为1,由于题意实际是连续递增或递减中的最长连续子序列,所以需要将数组在倒过来一下。
因为我们的dp数组操作只有i和i-1,所以我们可以用一个长度为2的滚动数组来优化空间
1 | int find(vector<int> &A ,int n){ |
最小路径和(lc)
链接:
https://leetcode-cn.com/problems/minimum-path-sum/
思路:
动态规划,上面和左面的路径一定是笔直走过来的,所以一直累加,f[i][j]的最短路径是左面或者上面其中某一个的最短路径和加上当前位置的长度,因为只涉及两行的动态规划,所以可以设计成两行的滚动数组
1 | int minPathSum(vector<vector<int>>& grid) { |
滑动窗口最大值(lc)
链接:
https://leetcode-cn.com/problems/sliding-window-maximum/
思路:
单调队列,将队列长度维护在k以内,保证队列的头部是当前区间内最大的值,要插入新值,需要与队列后端的元素进行比较,如果后端元素较小则需要弹出,保证
队列是单调递减的
1 | vector<int> maxSlidingWindow(vector<int>& A, int k) { |