算法学习Day2:数组
977. 有序数组的平方
暴力解法
循环每个数进行平方,然后sort排序
双指针
分别指向数组的两端,比较两个指针指向之数的平方,较大的数从数组前端加入,然后指针向中间进一位,直到两指针相等进行最后一次比较。
var sortedSquares = function(nums) {
let newNums =[]
let left = 0, right = nums.length-1
while(left<=right){
let leftSq = nums[left]*nums[left]
let rightSq = nums[right]*nums[right]
if(leftSq < rightSq){
// 从前端插入元素的方法
newNums.unshift(rightSq)
right --
}else{
newNums.unshift(leftSq)
left ++
}
}
return newNums
};
209. 长度最小的子数组
暴力解法
两个for循环,当循环中找到>= target 的连续子数组时就break跳出循环,让 i 前进一位再开始新一轮寻找(在自己做时忘记了这一步)
let fin = nums.length+1 //fin不会大于数组长度+1
let len=0
let count
for(let i=0;i<nums.length;i++){
count = 0
for(let j=i;j<nums.length;j++){
count = count + nums[j]
len = j-i+1 //子数组长度
if(count >= target){
fin = fin > len ? len : fin
//一旦连续元素总和超过目标就break,因为继续循环下去结果还是超过target的,而len反而增加了,要取最小结果,这里就直接break,到外层前进到下一个数重新计算
break
}
}
}
//判断fin是否有变化,没变化说明没有这个连续子数组
return fin == nums.length+1? 0 : fin
滑动窗口
当总和大于target,减去窗口最左侧数之后还有count>=target的情况,需要用循环进行这一步操作(这次忘记了)
var minSubArrayLen = function(target, nums) {
let left = 0,right=0
let count = 0
let fin = nums.length+1 //不会大于自身
while(right <= nums.length-1){
//窗口右侧前进
count += nums[right]
right++
//当总和超过目标时减去左侧窗口边缘数,左侧窗口前进,进行循环处理当减去边缘数之后还出现count>=target的情况
while(count >= target){
fin = fin > right-left ? right-left : fin
count -= nums[left]
left++
}
}
return fin == nums.length+1 ? 0 : fin
}
59. 螺旋矩阵 II
59. 螺旋矩阵 II
要设好多参数,,自己没有做出来
var generateMatrix = function(n) {
// 旋转起始位置
let startX = startY = 0
// 旋转圈数
let loop = Math.floor(n/2)
// 包括每层会重复的一个数和之前loop已经填充的数(我的想法)
let offset = 1
// 中心
let mid = Math.floor(n/2)
// 更新填充数字
let count=1
// 创建arr
const res = new Array(n).fill(0).map(()=>new Array(n).fill(0))
while (loop--) {
let row = startX, col = startY;
// 上行从左到右(左闭右开),最后一列不填充,作为下一层填充的第一个数,避免重复
for (; col < startY + n - offset; col++) {
res[row][col] = count++;
}
// 右列从上到下(左闭右开)
for (; row < startX + n - offset; row++) {
res[row][col] = count++;
}
// 下行从右到左(左闭右开)
for (; col > startY; col--) {
res[row][col] = count++;
}
// 左列做下到上(左闭右开)
for (; row > startX; row--) {
res[row][col] = count++;
}
// 更新起始位置
startX++;
startY++;
// 更新offset
offset += 2;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2 === 1) {
res[mid][mid] = count;
}
return res
};