首页 > 其他分享 >滑动窗口

滑动窗口

时间:2023-04-22 16:25:57浏览次数:32  
标签:map right 窗口 int result fruits 滑动 left

滑动窗口

1.  概念解释

  是双指针的一种,有快慢两个指针,慢指针指向窗口的起始位置,快指针指向窗口的末端位置;

  不断的调节子序列的起始位置和终止位置,从而得出结果。

  可参考的详细解释   

 

2.  解题思路/模板


int left;//左指针
int right;//右指针
int var;//随着窗口变化的量
for(int right =0; rightd的范围;right++){
  对var的操作;
  //修改var的值,且伴随着left的右移
  while(){
    ...
    left++;
  }
  return var;
}

 

private static int solution(int s, int[] nums){
  int sum = 0;
  int left=0;
  int result = Integer.MAX_VALUE;
  for (int right = 0; right < nums.length; right++) {
    sum+=nums[right];
    while (sum>=s){
      result = Math.min(result,(right-left+1));
      sum-=nums[left++];
    }
  }
  return result==Integer.MAX_VALUE?0:result;
}

 

//自己写的第一版
public static int solution1(int[] fruits){
  if(fruits==null){
    return -1;
  }
  if(fruits.length<=1){
    return fruits.length;
  }
  int left1=0;
  int left2=-1;
  int result= 1;
  int temp=1;
  for (int right = 1; right < fruits.length; right++) {
    temp = right -left1+1;
    if(left2==-1 && fruits[left1]!=fruits[right]){
      left2=right;
    }else{
      if(fruits[right]!=fruits[left1] && fruits[right]!=fruits[left2]){
        result = Math.max(temp-1,result);
        left1=left2;
        left2=-1;
        right=left1;
      }
    }
  }
  return result>temp?result:temp;
}

 

//leeetcode的题解(自己加了一点点注释),更能体现滑动窗口的思想
public static int solution2(int[] fruits){
  int n = fruits.length;
  Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();

  int left = 0, ans = 0;
  for (int right = 0; right < n; ++right) {
    //getOrDefault()是指返回某个key的value,若不存在则返回制定的默认值
    cnt.put(fruits[right], cnt.getOrDefault(fruits[right], 0) + 1);
    //从左往右,依次进行删除,直到哈希表的长度不大于2
    while (cnt.size() > 2) {
      cnt.put(fruits[left], cnt.get(fruits[left]) - 1);
      if (cnt.get(fruits[left]) == 0) {
        cnt.remove(fruits[left]);
      }
      ++left;
    }
    ans = Math.max(ans, right - left + 1);
  }
  return ans;
}

 

public static String solution(String s, String t){
  Map<Character,Integer> map = new HashMap();
  for (int i = 0; i < t.length(); i++) {
    map.put(t.charAt(i),map.getOrDefault(t.charAt(i),0)+1);
  }
  int left = 0;
  int[] result = {0,s.length()};
  for (int right = 0; right < s.length(); right++) {
    if(map.containsKey(s.charAt(right))){
      map.replace(s.charAt(right),map.get(s.charAt(right))-1);
    }
    while(nonNegative(map)){
      if((result[1]-result[0])>(right-left)){
      result[0] = left;
      result[1] = right;
      }
      if(map.get(s.charAt(left))!=null){
        map.replace(s.charAt(left),map.get(s.charAt(left))+1);
      }
      left++;

    }
  }
  return result[1]==s.length()?"":s.substring(result[0],result[1]+1);
}
//判断map是否有值非负的键值对,若有则返回false
private static boolean nonNegative(Map map){
  Iterator<Integer> it = map.values().iterator();
  while(it.hasNext()){
    if(it.next()>0){
      return false;
    }
  }
  return true;
}

标签:map,right,窗口,int,result,fruits,滑动,left
From: https://www.cnblogs.com/amulet/p/17343198.html

相关文章

  • 剑指Offer——59-I.滑动窗口的最大值(c语言)
    title:剑指Offer59-I.滑动窗口的最大值(c语言)给定一个数组nums和滑动窗口的大小k,请找出所有滑动窗口里的最大值。示例:输入:nums=[1,3,-1,-3,5,3,6,7],和k=3输出:[3,3,5,5,6,7]解释:滑动窗口的位置最大值-----------------......
  • toga的图像按钮和窗口管理
    Toga提供了多种常用控件,如按钮、标签、输入框等,还提供了窗口管理功能,可以用于创建跨平台的GUI应用程序。下面分别介绍图像按钮和窗口管理的用法。图像按钮-toga.ImageButtontoga.ImageButton用于创建一个图像按钮控件,用于触发操作或事件。常用参数:id:按钮控件的唯一标识符。......
  • umy-ui表格单行编辑(解决单行编辑滑动后失效问题)
    TableRowEdit.vue<template><div><ux-grid:data="tableData"tooltip-effect="dark"show-overflow="tooltip":cell-style="{'text-align':'center'}&q......
  • xshell断开ssh远程窗口,nginx进程被杀死
    主要原因:是openssh8+以上的版本对安全策略做了修改解决方法:在/usr/lib/systemd/system/[email protected] 配置增加KillMode=process[Unit]Description=OpenSSHper-connectionserverdaemonDocumentation=man:sshd(8)man:sshd_config(5)Wants=sshd-keygen.serviceAfter=sshd-ke......
  • C#窗口错误
    具体的错误是,我在主窗口打开了一个新的窗口,我关闭它之后,重新打开,就出现了这个错误这个错误是这样的,如下图所示 两种解决方式,其实本质上是一种,就是重写窗口的Onclosing的方法。第一种,直接在被调用窗口的cs里面重写这个方法,如下图所示。protectedoverridevoidOnClosing(Ca......
  • 01 OpenGL初步认知与窗口创建
    1.初识OpenGL本文是之前学习OpenGL所做的笔记,现在转到这里。1.1OpenGL(OpenGraphicsLibrary)一般它被认为是一个应用程序编程接口(API),它包含了一系列可以操作图形、图像的方法。然而,OpenGL本身并不是一个API,仅仅是一个规范,由Khronos组织制定并维护,所有版本的OpenGL规范文档都......
  • dxAlertWindowManager1 弹出提示窗口(09)
    默认显示效果(默认半透明,7秒后消失推出,鼠标移入后半透明效果消失)dxAlertWindowManager1.Show('提示','点击了表格'); 可以运行多次,自动垛叠显示01]添加图片显示拖一个cxImageList1,添加64*64图标dxAlertWindowManager1.Show('提示','点击了表格',0); ......
  • 【C#新手入门一】winform实现QQ登录窗口
    闲来无事,打算写一系列winform入门相关的小软件,算是对自己技术的一个复习和备忘,也希望能帮助刚入门的萌新(可能也帮不到,因为没有注释)第一期先用winform最大限度的还原QQ的登录界面,下图左侧是仿真的,右侧是QQ的界面,很明显能看出来高仿的和正版的区别,哈哈! 这是效果展示接下来......
  • 窗口函数
    概述:窗口函数和聚合函数类似之处在于它也是对一组数据进行分析;但是,窗口函数不是将一组数据汇总为单个结果;而是针对查询中的每一行数据,基于和它相关的一组数据计算出一个结果。窗口函数在其他数据库中也叫做分析函数,或者联机分析处理(OLAP)函数。 定义:窗口函数与其它函数的语法......
  • Label 显示Gif动画,窗口关闭偶发性抛出 在创建窗口句柄之前,不能在控件上调用 Invoke
    2个问题如下,解决方案都一样 问题1UnhandledException:System.InvalidOperationException:在创建窗口句柄之前,不能在控件上调用Invoke或BeginInvoke。在System.Windows.Forms.Control.MarshaledInvoke(Controlcaller,Delegatemethod,Object[]args,Booleansynchro......