26. 删除排序数组中的重复项
描述
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。
思路
解答
| |
73. 矩阵置零
题目
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用**原地算法。**
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12输入: [ [1,1,1], [1,0,1], [1,1,1] ] 输出: [ [1,0,1], [0,0,0], [1,0,1] ]示例 2:
1 2 3 4 5 6 7 8 9 10 11 12输入: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] 输出: [ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]进阶:
一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。 你能想出一个常数空间的解决方案吗?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/set-matrix-zeroes 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
最优解为解法三
解法一
使用两个数组,分别存储行和列对应为0的位置
再遍历两个数组,对矩阵的行或列进行置零
| |
解法二
题目要求常数级别的空间复杂度,这就要求在矩阵本身做标记
思路:
| |
代码:
| |
思路三
不利用额外的空间来存储,将矩阵所在的行或列的第一个元素来记录本行或列是否需要置零
不过需要两个bool置记录第一行或第一例是否需要置零
| |
845. 数组中的最长山脉
题目
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:
B.length >= 3- 存在
0 < i < B.length - 1使得B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1](注意:B 可以是 A 的任意子数组,包括整个数组 A。)给出一个整数数组 A,返回最长 “山脉” 的长度。
如果不含有 “山脉” 则返回 0。
示例 1:
1 2 3输入:[2,1,4,7,3,2,5] 输出:5 解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。示例 2:
1 2 3输入:[2,2,2] 输出:0 解释:不含 “山脉”。提示:
1 20 <= A.length <= 10000 0 <= A[i] <= 10000
解答
遍历整个数组,维护三个状态
- 不上升和下降
- asc、desc置0
- 直接往后
- 上升:asc++
- 若desc不为0➛证明是从新的山脚开始up➛asc初始化为1
- 置desc为0[先升后降才算山脉]
- 下降:desc++
- 若asc不为0➛证明之前上升过➛取历史宽度最大
| |
454. 四数相加 II
题目
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组
(i, j, k, l),使得A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。
例如:
1 2 3 4 5 6 7 8 9 10 11输入: A = [ 1, 2] B = [-2,-1] C = [-1, 2] D = [ 0, 2] 输出: 2 解释: 两个元组如下: 1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0 2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/4sum-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
由于是四个组合,将它们分为两等份
对一组遍历求和后,记录到map内。
另外一组遍历求和,只要存在map内的相反数,即代表得到结果
| |
