- 寻找数组的中心索引 724题 easy">1. 寻找数组的中心索引 724题 easy
- 至少是其他数字两倍的最大数 747题 easy">2. 至少是其他数字两倍的最大数 747题 easy
- 加一 66题 Easy">3. 加一 66题 Easy
- 颜色分类 75题 middle">4. 颜色分类 75题 middle
- 数组中的第K个最大元素 215题 middle">5. 数组中的第K个最大元素 215题 middle
- 合并两个有序数组 88题 easy">6. 合并两个有序数组 88题 easy
1. 寻找数组的中心索引 724题 easy
思路:由于可能会存在多个中心索引,我们返回的是第一个。。。
所以从左至右递推,index指针从0向右移动,随之改变left right的和,得到首处left===right即可。
var pivotIndex = function(nums) {
let index = 0
let left = 0
let result = -1;
let right = nums.reduce((acc,curr)=>{acc+=curr;return acc},0)-nums[0]
while(index<=nums.length-1){
if(left===right){
result = index
break
}
left += nums[index]
right -= nums[index+1]
index++
}
return result
};
2. 至少是其他数字两倍的最大数 747题 easy
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
思路:
- 先找最大的,然后再逐次判断是否为两倍
- 迭代两次,好蠢
- 迭代一次,找到最大与次大的元素即可
3. 加一 66题 Easy
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
输入: [1,2,3]
输出: [1,2,4]
思路:
- 直接在数组上操作,但是有进位的问题
- 转化成数字做加减然后再拆分,但是又大数运算的问题
- 6145390195186705543+1 = 6145390195186705000
用do while把第一次很蠢的代码优化了一下,执行效果好多了
const plusOne = function(digits) {
let carryFlag = false;
let index = digits.length - 1;
do {
if (index < 0) {
return [1].concat(digits);
}
if (digits[index] < 9) {
digits[index] += 1;
return digits;
carryFlag = false;
}
digits[index] = 0;
carryFlag = true
index -= 1;
} while (carryFlag === true);
// 首次判断是否需要进位
};
4. 颜色分类 75题 middle
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
原地对它们进行排序
这个题目只规定数字只有0,1,2
你能想出一个仅使用常数空间的一趟扫描算法吗?
- 计数排序的思想
- 先扫描一次记录数字+个数,再输出
- 每一个数的增加 都需要格外的空间来存储,且会扫描两趟
var sortColors = function(nums) {
let zeroCount = 0;
let oneCount = 0;
let twoCount = 0;
nums.forEach((num)=>{
num===0 && (zeroCount +=1);
num===1 && (oneCount +=1);
num===2 && (twoCount +=1);
})
let result = new Array(nums.length)
nums.fill(0,0,zeroCount)
nums.fill(1,zeroCount,zeroCount+oneCount)
nums.fill(2,zeroCount+oneCount,zeroCount+oneCount+twoCount)
};
- 三路快排,这里我还没找到比较好的资料
5. 数组中的第K个最大元素 215题 middle
输入: [3,2,3,1,2,4,5,5,6] 和
k = 4
输出: 4
我的思路:维护一个降序[a,b,c,d]的队列,最小的在末尾,如果有大于最小值的,加入到队列中,挤出最小值。
这样的复杂度 是 n*排序算法(数据量为K)
三路快排是最快的
6. 合并两个有序数组 88题 easy
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
我的思路:要充分利用好两个数组的有序性,将总个数少的数组的元素依次插入另一个数组中。
[1,2,3,2,5,6]