leetcode
nielaishan
这个作者很懒,什么都没留下…
展开
-
LeetCode 152. 乘积最大子数组
题目链接:https://leetcode.cn/problems/maximum-product-subarray/ /** 解法1: 贪心做法: 因为时乘积,由此得出以下结论 1、出现0,肯定分割为前后两个段,从这两个段内找乘积最大 2、在[2,-1,-3,-2,4]数组中,出现负数的个数为奇数时,将导致乘积为负数; 2.1 所以要将数组中的总乘积48, 除以从数组中的第一个负数位置开始从右往左的每个数; 2.2 所以要将数组中的总乘积48, 除以从数组中的最后一个负数位置开始从左往右的每个数; 2.3原创 2022-05-23 08:56:18 · 169 阅读 · 0 评论 -
LeetCode 64. 最小路径和
/** 二维转移方程:dp[i][j] = min(dp[i-1][j] , d[i][j-1]) + grid[i][j]; dp[i][j] 为从(0,0)到(i,j)路径最小值 从题目描述就可得到,当前位置的最小值,肯定来自上面([i-1][j])的位置和左面([i][j-1])的位置的最小值加上当前位置的数值 特殊处理:i==0 或者 j==0 只能累加当前列或当前行 二维数组解法:清晰,明确 进阶版:滚动数组 转移方程:dp[j] = min(dp[j], dp[j-1]) + grid[i.原创 2022-05-23 08:20:14 · 148 阅读 · 0 评论 -
LeetCode 11. 盛最多水的容器
/** [1,8,6,2,5,4,8,3,7] 双指针算法 left指向头,right指向尾 这时应该移动left还是right呢 1. 应该移动高度小的那个位置 height[left] <= height[right] 1.1 移动left指针,若移动时,while height[left+1] <= height[left] left++; 因为比height[left]还小,面积肯定更小,实际就是找到第一个比height[left]大的数 1.2 移动right指针时,同理 */ f.原创 2022-05-17 13:52:07 · 192 阅读 · 0 评论 -
LeetCode 31. 下一个排列
/** 1,2,3,4 1,2,4,3 1,3,2,4 1,3,4,2 1,4,2,3 1,4,3,2 2,1,3,4 2,1,4,3 2,3,1,4 2,3,4,1 ... 4,3,2,1 从以上得到规律 解题思路 1. 从后往前找到第一个相邻升序的位置 i, i+1 2. 从后往前找到第一个比a[i]的大的数 k 3. 交换a[i] a[k] 4. 然后将i+1之后的位置,reverse */ func nextPermutation(nums []int) { i, j, k := len(.原创 2022-05-17 09:59:40 · 135 阅读 · 0 评论 -
LeetCode 221.最大正方形 解法
/** LeetCode 221.最大正方形 形成2*2的小正方形,基础上 [ [a, b] [c, d(?)] ] 若b >= a && c >= a说明d所在的一个正方形可以在a的基础上,扩充一行一列,变为长宽为a+1的正方形 否则d为Min(b, c)的最小值为长宽的正方形,增加一行一列,变为长宽为Min(b, a)+1的正方形 */ func maximalSquare(matrix [][]byte) int { rowLen := len(matrix) .原创 2020-05-09 13:40:39 · 196 阅读 · 0 评论 -
LeetCode 632.最小区间
/** LeetCode 632.最小区间 解题思路:排序、离散化 把所有数字按照数值大小从小到大排序,但是每个携带属于哪个k(行) 然后把排序后的数字,离散化。例如: [34,56,10000]离散后,为[0,1,2] 若有相同的数字要记录不同的k(属于哪个行)。 然后每个离散后的数字以此为起点,找一个满足条件的区间 */ func smallestRange(nums [][]int) [...原创 2020-05-08 14:59:34 · 237 阅读 · 0 评论 -
LeetCode 带限制的子序列和
/** LeetCode 带限制的子序列和 由题意可知,第i位的最大子序和,是在区间[i-k, i-1]中的最大值加上nums[i],但是若得出的结果,比nums[i]小,便舍弃。 转移方程: dp[i] = Max(nums[i], dp[i-k...i-1] + nums[i]) 初始化: dp[0] = nums[0] 利用堆heap维护dp[i-k...i-1]的递减序列 */ func...原创 2020-05-07 11:01:37 · 204 阅读 · 0 评论 -
LeetCode 对角线遍历II
/** LeetCode 对角线遍历 II 对于同一个对角线上,i与j相加的值是相同的,而且i越大,越早输出 由此,可以通过设置一个比较大的数值为一个位置的权重,同一个对角线的权重相同,而i也是影响输出时机 以此基础,可以通过排序,获的输出时机 */ func findDiagonalOrder(nums [][]int) []int { cnt := len(nums) // 权重初始化 ...原创 2020-04-27 21:21:47 · 194 阅读 · 0 评论 -
LeetCode 生成数组
/** dp[n][k][m] 定义为:n个位置,k个search_cost,以m结尾的数组种类个数 由这个定义,可得初始化 dp[1][1][1...m] = 1 转移方程为:dp[n][k][m] = m*dp[n-1][k][m] + dp[n-1][k-1][m-1] + dp[n-1][k-1][m-2] + ... + dp[n-1][k-1][1] 由此最后结果:n个位置,k个se...原创 2020-04-26 13:07:26 · 211 阅读 · 0 评论 -
LeetCode 数青蛙
问题内容 给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。 注意:要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没...原创 2020-04-21 13:10:22 · 356 阅读 · 0 评论 -
LeetCode--买卖股票的最佳时机系列
买卖股票的最佳时机I 通过一次交易,获得最大利润,可以使用栈维护一个上升子序列,若第i天的价格大于栈顶元素,入栈,并计算栈底和栈顶的差值,记录这个差值;若第i天的价格小于栈顶元素,循环出栈,直到大于栈顶元素或者栈为空; type Stack struct { Sli []int Len int } func (s *Stack) Push(val int) { s.Sli[s.Len...原创 2020-03-22 18:15:54 · 515 阅读 · 0 评论