算法学习Day2:数组

算法学习Day2:数组

977. 有序数组的平方

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. 长度最小的子数组

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
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值