![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
宫水三叶每日一题系列
immortalize
这个作者很懒,什么都没留下…
展开
-
Leetcode638:大礼包
Leetcode638:大礼包题目:在 LeetCode 商店中, 有 n 件在售的物品。每件物品都有对应的价格。然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。给你一个整数数组 price 表示物品价格,其中 price[i] 是第 i 件物品的价格。另有一个整数数组 needs 表示购物清单,其中 needs[i] 是需要购买第 i 件物品的数量。还有一个数组 special 表示大礼包,special[i] 的长度为 n + 1 ,其中 special[i][j] 表示第原创 2022-05-11 11:43:20 · 393 阅读 · 0 评论 -
Leetcode1155:掷骰子的N种方法
Leetcode1155:掷骰子的N种方法题目:这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1 到 k 。给定三个整数 n , k 和 target ,返回可能的方式(从总共 kn 种方式中)滚动骰子的数量,使正面朝上的数字之和等于 target 。答案可能很大,你需要对 109 + 7 取模 。思路:分组背包代码如下:class Solution { int mod = (int)1e9+7; public int numRoll原创 2022-05-10 09:42:37 · 289 阅读 · 0 评论 -
Leetcode942:增减字符串匹配(贪心算法)
Leetcode942:增减字符串匹配题目:由范围 [0,n] 内所有整数组成的 n + 1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中:如果 perm[i] < perm[i + 1] ,那么 s[i] == ‘I’如果 perm[i] > perm[i + 1] ,那么 s[i] == ‘D’给定一个字符串 s ,重构排列 perm 并返回它。如果有多个有效排列perm,则返回其中 任何一个 。思路:贪心算法每当遇到I,则把当前的最小值给遍历的原创 2022-05-09 15:07:13 · 378 阅读 · 0 评论 -
Leetcode494:目标和(回溯算法)
Leetcode494:目标和题目:给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。思路:回溯算法代码如下:class Solution { int原创 2022-05-09 15:06:10 · 163 阅读 · 0 评论 -
Leetcode442:数组中重复的数据
Leetcode442:数组中重复的数据题目:给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。思路:定义一维数组且初始化所有的数据为1,每当数组的数字位置出现过1次,数组的数字位置的值减1;当数组的数字位置的值小于0时,说明数组的数字位置出现过两次或以上次数,则将该原创 2022-05-08 10:00:33 · 276 阅读 · 0 评论 -
Leetcode474:一和零
Leetcode474:一和零题目:给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。思路:动态规划、背包问题代码如下:class Solution { public int findMaxForm(String[] strs, int m, int n) { int l原创 2022-05-08 09:59:24 · 255 阅读 · 0 评论 -
leetcode933:最近的请求次数
leetcode933:最近的请求次数题目:写一个 RecentCounter 类来计算特定时间范围内最近的请求。请你实现 RecentCounter 类:RecentCounter() 初始化计数器,请求数为 0 。int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。保证 每次对 ping 的调用都使用比之前更大的 t 值。原创 2022-05-06 20:45:18 · 73 阅读 · 0 评论 -
Leetcode713:乘积小于k的子数组(滑动窗口)
Leetcode713:乘积小于k的子数组题目:给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。思路:滑动窗口代码如下:class Solution { public int numSubarrayProductLessThanK(int[] nums, int k) { int res = 0; int n = nums.length; //当k为1时,任何子数组的乘积均原创 2022-05-05 10:09:10 · 455 阅读 · 0 评论 -
Leetcode518:零钱兑换II
Leetcode518:零钱兑换II题目:给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。思路:完全背包+动态规划代码如下:class Solution { public int change(int amount, int[] coins) {原创 2022-05-05 10:07:46 · 324 阅读 · 0 评论 -
leetcode1823:找出游戏的获胜者(约瑟夫问题)
leetcode1823:找出游戏的获胜者题目:共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。游戏遵循如下规则:从第 1 名小伙伴所在位置 开始 。沿着顺时针方向数 k 名小伙伴,计数时需要 包含 起始时的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次。原创 2022-05-04 12:13:15 · 141 阅读 · 0 评论 -
leetcode322:零钱兑换
leetcode322:零钱兑换题目:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。思路:动态规划+背包问题;定义一维数组nums,nums[i] 含义:凑成总金额为i所需的最少硬币个数代码如下:class Solution { int INF = 0x3f3f3f3f;原创 2022-05-04 11:03:02 · 2893 阅读 · 0 评论 -
Leetcode279:完全平方数
Leetcode279:完全平方数题目:给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。思路:动态规划或背包问题数组f[i] 表示返回和为i的完全平方数的最少数量先考虑最坏情况,然后根据平方数(平方数<=n)递增依次进行优化代码如下:class Solution { public in原创 2022-05-03 10:16:05 · 360 阅读 · 0 评论 -
Leetcode1049:最后一块石头的重量II
Leetcode1049:最后一块石头的重量II题目:有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没原创 2022-05-02 10:30:59 · 155 阅读 · 0 评论 -
Leetcode416:分割等和子集&&Leetcode1305:两棵二叉搜索树中的所有元素
Leetcode416:分割等和子集题目:给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。思路:0-1背包问题代码如下:class Solution { public boolean canPartition(int[] nums) { //长度为0或者空数组,不可能分割等和子集 if (nums.length==0||nums==null){ re原创 2022-05-01 10:36:05 · 111 阅读 · 0 评论 -
Leetcode908:最小差值I
Leetcode908:最小差值I 给你一个整数数组 nums,和一个整数 k 。 在一个操作中,您可以选择 0 <= i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] + x ,其中 x 是一个范围为 [-k, k] 的整数。对于每个索引 i ,最多 只能 应用 一次 此操作。 nums 的 分数 是 nums 中最大和最小元素的差值。 在对 nums 中的每个索引最多应用一次上述操作后,返回 nums 的最低 分数 。 思原创 2022-04-30 19:03:22 · 322 阅读 · 0 评论 -
leetcode2220:转换数字的最小位翻转次数
题目:一次 位翻转 定义为将数字 x 二进制中的一个位进行 翻转 操作,即将 0 变成 1 ,或者将 1 变成 0 。 比方说,x = 7 ,二进制表示为 111 ,我们可以选择任意一个位(包含没有显示的前导 0 )并进行翻转。比方说我们可以翻转最右边一位得到 110 ,或者翻转右边起第二位得到 101 ,或者翻转右边起第五位(这一位是前导 0 )得到 10111 等等。 给你两个整数 start 和 goal ,请你返回将 start 转变成 goal 的 最少位翻转 次数。 思路: 先原创 2022-04-30 09:48:21 · 180 阅读 · 0 评论