首页 > 其他分享 >day2 双指针与滑动窗口

day2 双指针与滑动窗口

时间:2024-07-18 13:31:13浏览次数:7  
标签:nums int day2 result 数组 滑动 subCount 指针

任务

977. 有序数组的平方

给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

思路

由于平方后最大值只可能出现在左右两边,所以每次取左右两边的较大值加入到新数组的尾部。故采用双指针法,一个指向尾部,一个指向头部,每次取符合条件的元素,放入到新数组中,注意循环条件,两个指针相遇时也需要处理当前位置的值,也就是最后一个未处理的值。(第一次做的时候妄图用同一个数组双指针遍历一次来处理,编码后发现后指针除了指示已完成的位置,还要保存该位置当前的数的平方,也就是说在迭代中的每一步,无法满足两个要求,所以需要新数组作为返回,后指针的作用和前指针一样,只是为了保存待放入的值。对比而言,之所以就地逆置可以在一个数组中完成,时因为在迭代中的每一步可以完成两个位置的确认,且此后也再也不需要这两个位置的信息了)

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        size = len(nums)
        i = 0
        j = size-1
        resultList = []
        while i<=j:
            v0 = nums[i] * nums[i]
            v1 = nums[j] * nums[j]
            if v0 < v1:
                resultList.insert(0,v1) 
                j-=1
            else:
                resultList.insert(0,v0) 
                i+=1
        return resultList

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target。
找出该数组中满足其总和大于等于 target 的长度最小的
子数组[numsl, numsl+1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组返回0

思路

两个指针遍历数组,其中一个表示以当前位置开头,另一个表示以当前位置结尾。两重循环,确认每个位置的最小长度。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        size = len(nums)
        result = 100000
        i = 0
        j = 0
        while i < size:
            sum = 0
            subCount = 0
            for j in range(i,size):
                sum += nums[j]
                subCount += 1
                if sum >= target:
                    result = subCount if subCount<result else result
                    break
            i+=1
        result = 0 if result==100000 else result
        return result

滑动窗口法:这种方法比较难想到,与上面暴力法相反的,不是确定每个位置开头的满足条件子数组,而是确定每个位置结尾的满足条件子数组,再把头往后移,最终找到每个位置满足条件的最小子数组。需要注意的是count不是累加,是可以直接得到的,即j-i+1。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        size = len(nums)
        result = float('inf')
        i = 0
        j = 0
        sum = 0
        subCount = 0
        while j <size:
            sum += nums[j]
            while sum >= target:
                subCount = j - i + 1
                result = subCount if subCount < result else result
                sum -= nums[i]
                i += 1    
            j+=1
        result = 0 if result==float('inf') else result
        return result

59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

思路:

模拟类题目,需要弄清楚边界。先想到外圈是简单的模拟,后续需要想到实际每一轮(不断向内圈)都是不断的旋转,按照向右向下向左向上的方式,一圈一圈的旋转,最简单的循环终止条件就是当值等于n平方时。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        result = [[0] * n  for _ in range(n)] 
        num = 1
        left,right,top,bottom = 0,n,0,n
        endNum = n * n
        while(num <= endNum):
            for j in range(left,right): 
                result[top][j] = num
                num += 1
            top += 1
            for i in range(top,bottom): 
                result[i][right-1] = num
                num+=1
            right-=1
            for j in range(right-1,left-1,-1):
                result[bottom-1][j] = num
                num+=1
            bottom-=1
            for i in range(bottom-1,top-1,-1):
                result[i][left] = num
                num+=1
            left+=1
        return result

总结

数组部分的内容主要如下

  • 二分查找 失败返回-1和失败返回查找位置,看似两个非常相近的问题,实际解决思路确实非常不同,一个是缩小查找范围,另一个是将数组从全员未知变成左右边两个特征的分段
  • 双指针法,有时是快慢指针法,之前的day1的移除元素题目 slow是负责维护满足条件的元素的哨兵,fast是负责检查每个元素。而有序数组的平方这道题目,并不是快慢指针,由于满足条件的一定在数组两端,实际上只是比较两个前后两个指针所指向的值的大小,它们的功能相同均是检查指向元素。
  • 滑动窗口法 由通常想到的确定每个开始位置的子数组改为了每个结束位置的满足条件的子数组,再移动头的思路。
  • 模拟类 需要抓住循环条件和边界条件,如螺旋矩阵 II

标签:nums,int,day2,result,数组,滑动,subCount,指针
From: https://www.cnblogs.com/haohaoscnblogs/p/18309333

相关文章

  • iOS开发基础131-isa指针
    iOS中isa指针是Objective-C对象内部的一个重要概念,它是实现对象与类之间关系的核心机制。深入理解isa指针对掌握Objective-C的底层运行机制和对象模型非常重要。1.什么是isa指针每个Objective-C对象都有一个isa指针,它指向这个对象所属的类。类本身也有一个isa指针,指向其元类(met......
  • uniapp(全端兼容) - 最新详细实现 “卡片式堆叠“ 轮播图效果,堆叠在一起的轮播图片可
    效果图在uni-app微信小程序/手机h5网页网站/安卓app/苹果app/支付宝小程序/nvue等(全平台完美兼容)开发中,实现uniApp各端都兼容的图片堆叠轮播图功能,层叠轮播插件,详细实现上下层叠轮播图并且在全平台通用兼容,卡片叠加在一起的轮播翻滚,错开叠加来回拖曳左右滚动切换,支持修改......
  • DataWhale AI夏令营 电力预测赛Day2
    LightGBM支持高效LightGBM(LightGradientBoostingMachine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式,可以快速处理海量数据等优点。LightGBM框架中还包括随机森林和逻辑回归等模型。通常应用......
  • OpenCV窗口交互(窗口滑动条,鼠标响应)
    窗口交互操作#####(1)图像窗口滑动条​Open-CV中创建滑动条函数原型为:intcreateTrackbar(constString&trackbarname,constString&winname,int*value,intcount,TrackbarCallbackonChange=......
  • 数据结构 day2
    目录思维导图:学习内容:1. 共用体1.1引入目的1.2 定义及初始化1.2.1 概念1.2.2定义格式1.2.3初始化1.2.4变量的大小例子:2. 类型重定义2.1使用方法2.2使用方式(也可以连续定义)2.2.1类型重定义2.2.2  使用方式3.#define与typedef的区别例如:4. ......
  • C++ 智能指针类型转换测试
    这个是GPT回答的,可以运行。#include<iostream>#include<memory>classBase{public:virtualvoidshow()const{std::cout<<"Baseclass"<<std::endl;}virtual~Base()=default;//确保基类有虚析构函数};classDe......
  • 图解C++中的寻址。指针常量,常量指针。const int *p ,int * const p
    输出方式1.直接输出——采用直接寻址,输出内存块中的操作数,变量值变量名代替地址,容易记忆。intmain(){inta=10;//a=0x99fdcout<<a<<endl;//10,输出时系统采用直接寻址,输出a地址中存储的操作数return0;}2.取地址,&a——输出地址intmain()......
  • 指针的初步认识
    1.什么是指针?    1.1什么是数据/变量的地址        地址就是数据在内存中的存储位置。指针就是数据在内存中的存储地址,或者叫数据在内存中的编码位置。    1.2指针变量        用来存储指针/地址的变量叫做指针变量。 ......
  • 避免函数形参为空指针
    展示一个函数形参为空指针的隐患:执行第32行代码时,相当于执行double*pdPoint=pdTemp;,由于pdTemp=NULL,所以pdPoint=NULL。在然后 voidPointer(double*pdPoint,intiDim)函数中对pdPoint赋了一块动态内存,此时 pdPoint!=NULL,但是 pdPoint和pdTemp只是赋值......
  • day1 二分查找(及其进阶)和移除元素的双指针法
    基础概念算法的单调性:问题的规模随着算法的推进不断缩减(如704中开始的查找区间是[lo,hi),随着循环的进行,问题规模确实在不断的缩小)算法的不变性:在初始状态下自然满足,当问题的有效规模缩减为0时,不变性应该随即等于正确性。(如704中开始的查找区间是[lo,hi),最终要么直接命中,要么......