山脉数组的峰顶索引
力扣 852. 山脉数组的峰顶索引题目说明
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在
i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。
示例示例 1:
12输入:arr = [0,1,0]输出:1
示例 2:
12输入:arr = [0,2,1,0]输出:1
示例 3:
12输入:arr = [0,10,5,2]输出:1
示例 4:
12输入:arr = [3,4,5,1]输出:2
示例 5:
12输入:arr = [24 ...
猜数字大小
力扣 374. 猜数字大小题目说明
猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
返回我选出的数字。
示例示例 1:
12输入:n = 10, pick = 6输出:6
示例 2:
12输入:n = 1, pick = 1输出:1
示例 3:
12输入:n = 2, pick = 1输出:1
示例 4:
12输入:n = 2, pick = 2输出:2
笔者理解此题是一道二分查找算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,发现此题是比较经典的二分查找,让我们来看看具体如何实现的吧。 ...
第一个错误的版本
力扣 278. 第一个错误的版本题目说明
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例1234567给定 n = 5,并且 version = 4 是第一个错误的版本。调用 isBadVersion(3) -> false调用 isBadVersion(5) -> true调用 isBadVersion(4) -> true所以,4 是第一个错误的版本。
笔者理解此题是一道二分查找算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,发现此题是比较经典的二分查找,让我们来看看具体如何实现的吧。
实现123456789 ...
完全平方数
力扣 279. 完全平方数题目说明
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
提示:
1 <= n <= 10^4
示例示例 1:
123输入:n = 12输出:3 解释:12 = 4 + 4 + 4
示例 2:
123输入:n = 13输出:2解释:13 = 4 + 9
笔者理解此题是一道动态规划算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现此题可以使用数学原理,还可以使用动态规划,让我们来看看具体如何实现的吧。
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555 ...
零钱兑换II
力扣 518. 零钱兑换 II题目说明
给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
提示:
0 <= amount (总金额) <= 5000
1 <= coin (硬币面额) <= 5000
硬币种类不超过 500 种
结果符合 32 位符号整数
示例示例 1:
1234567输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1
示例 2:
123输入: amount = 3, coins = [2]输出: 0解释: 只用面额2的硬币不能凑成总金额3。
示例 3:
12输入: amount = 10, coins = [10] 输出: 1
笔者理解此题是一道动态规划算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现此题很直接的动态规划题,想清楚状态转移就很清晰了,让我们来看看具体如何实现的吧。
实现1234567891011121314151 ...
目标和
力扣 494. 目标和题目说明
给你一个整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。
提示:
1 <= nums.length <= 20
0 <= nums[i] <= 1000
0 <= sum(nums[i]) <= 1000
-1000 <= target <= 100
示例示例 1:
12345678输入:nums = [1,1,1,1,1], target = 3输出:5解释:一共有 5 种方法让最终目标和为 3 。-1 + 1 + 1 + 1 + 1 = 3+1 - 1 + 1 + 1 + 1 = 3+1 + 1 - ...
一和零
力扣 474. 一和零题目说明
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
提示:
1 <= strs.length <= 600
1 <= strs[i].length <= 100
strs[i] 仅由 '0' 和 '1' 组成
1 <= m, n <= 100
示例示例 1:
1234输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3输出:4解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 ...
移除链表元素
力扣 203. 移除链表元素题目说明
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
提示:
列表中的节点在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= k <= 50
示例示例 1:
12输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]
示例 2:
12输入:head = [], val = 1输出:[]
示例 3:
12输入:head = [7,7,7,7], val = 7输出:[]
笔者理解此题是一道链表算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,发现此题直接求解即可,这这里,我采用一个临时节点放在head前面,这样可能会方便一点,让我们来看看具体如何实现的吧。
实现123456789101112131415161718192021222324252627282930313233343536373839/** * Definition ...
相交链表
力扣 160. 相交链表题目说明
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
提示:
listA 中节点数目为 m
listB 中节点数目为 n
0 <= m, n <= 3 * 10^4
1 <= Node.val <= 10^5
0 <= skipA <= m
0 <= skipB <= n
如果 listA 和 listB 没有交点,intersectVal 为 0
如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]
示例示例 1:
12345输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2 ...
连续数组
力扣 525. 连续数组题目说明
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。
提示:
1 <= nums.length <= 10^5
nums[i] 不是 0 就是 1
示例示例 1:
123输入: nums = [0,1]输出: 2说明: [0, 1] 是具有相同数量0和1的最长连续子数组。
示例 2:
123输入: nums = [0,1,0]输出: 2说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。
示例 3:
12输入: nums = [0,1,1,0,1,1,1,0]输出: 4
笔者理解此题是一道哈希表算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现本题和昨天的每日一题连续的子数组和有点类似,只要将题目中的0换成-1,就转化成昨天类似的前缀和+同余定理的题目了,让我们来看看具体如何实现的吧。
实现1234567891011121314151617181920212223242526272829303132333435clas ...








