LeetCode数组类算法解体思路:
做好初始定义
做数组类算法问题的时候,我们常常需要定义一个变量,明确该变量的定义,并且在书写整个逻辑的时候,要不停的维护住这个变量的意义。也特别需要注意初始值和边界的问题。
1. 移动零
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let len = nums.length
let j = 0
for (let i = 0; i < len; i++) {
if (nums[i]) {
nums[j++] = nums[i]
}
}
for (let i = j; i < len; i++) {
nums[i] = 0
}
return nums
};
LeetCode「视频题解」数组类算法系列:283. 移动零 - 知乎LeetCode「视频题解」数组类算法系列:283. 移动零https://www.zhihu.com/zvideo/1312510605584932864
2. 移除元素
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
let j = nums.length
let i = 0
while (i < j) {
// 遇到相等的就把这个元素丢到末尾去
if (nums[i] === val) {
nums[i] = nums[j-1]
// 同时数组长度-1
j--
} else {
i++
}
}
return i
};
LeetCode「视频题解」数组类算法系列:27. 移除元素 - 知乎LeetCode「视频题解」数组类算法系列:27. 移除元素https://www.zhihu.com/zvideo/13125128343797514243. 删除排序数组中的重复
LeetCode「视频题解」数组类算法系列:26. 删除排序数组中的重复项 - 知乎LeetCode「视频题解」数组类算法系列:26. 删除排序数组中的重复项https://www.zhihu.com/zvideo/13125223032181964804.删除排序数组中的重复 II
运用基础算法思想
典型的排序算法思想、二分查找思想在解 LeetCode 题目时很有用。
5.颜色分类
LeetCode「视频题解」数组类算法系列:75. 颜色分类 - 知乎LeetCode「视频题解」数组类算法系列:75. 颜色分类https://www.zhihu.com/zvideo/13125242791881932806.数组中的第K个最大元素
LeetCode「视频题解」数组类算法系列:215. 数组中的第K个最大元素 - 知乎LeetCode「视频题解」数组类算法系列:215. 数组中的第K个最大元素https://www.zhihu.com/zvideo/1311122063432355840五分钟入门堆排序 - 知乎五分钟入门堆排序https://www.zhihu.com/zvideo/13119405170234408967.合并两个有序数组
对撞指针
有一些 LeetCode 题目,我们可以采用对撞指针进行求解:指针 i 和 j 分别指向数组的第一个元素和最后一个元素,然后指针 i 不断向前, 指针 j 不断递减,直到 i = j(当然具体的逻辑操作根据题目的变化而变化)。
8.两数之和 II - 输入有序数组
LeetCode「视频题解」数组类算法系列:125. 验证回文串 - 知乎LeetCode「视频题解」数组类算法系列:125. 验证回文串https://www.zhihu.com/zvideo/131260794312496742410.反转字符串中的元音字母
滑动窗口
一些题目用滑动窗口方法解题,可以将时间复杂度控制在 O(n) 级别,最重要的是定义好滑动窗口,明确它要表达的意思,当然边界和初始值非常重要。
12.长度最小的子数组