当前位置: 首页 > article >正文

【双指针题目】

双指针

  • 美丽区间(滑动窗口)
  • 合并数列(双指针的应用)
  • 等腰三角形
  • 全部所有的子序列

美丽区间(滑动窗口)

美丽区间
在这里插入图片描述

滑动窗口模板:

int left = 0, right = 0;

while (right < nums.size()) {
    // 增大窗口
    window.addLast(nums[right]);
    right++;
    
    while (window needs shrink) {
        // 缩小窗口
        window.removeFirst(nums[left]);
        left++;
        //....更新
    }
}
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    	   public static void main(String[] args) {
	        Scanner scan = new Scanner(System.in);
	        //在此输入您的代码...
	        int slow=0,fast=0;
	        int min=(int)1e5+1;//最小区间
	        
	        int n=scan.nextInt();
	        int S=scan.nextInt();
	        int[]arr=new int[n];
	        for(int i=0;i<n;i++){
	            arr[i]=scan.nextInt();
	        }
	        int sum=0;//区间中的和
	        //fast 有解,slow 最优解
	        while(fast< n){
	           
	            	sum+=arr[fast];//扩大区间[slow,fast),更新sum
	                fast++;               
	         
	            
	            while(sum-arr[slow]>=S){
	            	 sum-=arr[slow];//缩小区间[slow,fast),更新sum
	                slow++;
	                
	                //跟新min
		            if(min>(fast-slow)){
		                min=fast-slow;
		            }
	            }            

	        }
	        if(min==(int)1e5+1) {
	        	System.out.println(0);
	        }else {
	        	System.out.println(min);
	        }
	        
	        
    }
}

合并数列(双指针的应用)

合并数列
在这里插入图片描述

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.util.ArrayList;
public class Main {
 public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n=scan.nextInt();
        int m=scan.nextInt();
        ArrayList<Integer>arr1=new ArrayList<Integer>();
        for(int i=0;i<n;i++){
            arr1.add(scan.nextInt());
        }
        ArrayList<Integer>arr2=new ArrayList<Integer>();
        for(int i=0;i<m;i++){
            arr2.add(scan.nextInt());
        }
        int l1=0,l2=0;
        int count=0;
        while(l1<arr1.size()&&l2<arr2.size()){
            if(arr1.get(l1)<arr2.get(l2)){
                //合并arr1中的l1,l1+1
            	arr1.set(l1, arr1.get(l1)+arr1.remove(l1+1));
            	count++;
            }else if(arr1.get(l1)>arr2.get(l2)) {
            	//合并arr2中的l2和l2+1
            	arr2.set(l2, arr2.get(l2)+arr2.remove(l2+1));
                count++;
            }else {
            	l1++;
            	l2++;
            }
        }
        System.out.println(count);
        scan.close();
    }
}

等腰三角形

在这里插入图片描述

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.util.ArrayList;
import java.util.Collections;
public class Main {
     public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int N=scan.nextInt();
        ArrayList<Integer> list1=new ArrayList<Integer>();
        for(int i=0;i<N;i++) {
        	list1.add(scan.nextInt());
        }
        ArrayList<Integer> list2=new ArrayList<Integer>();
        for(int i=0;i<N;i++) {
        	list2.add(scan.nextInt());
        }
        Collections.sort(list1);
        Collections.sort(list2);
        int j=0;
        int count=0;
        //两个指针指向两个数组,根据两边(腰)之和大于第三边(底)
        for(int i=0;i<N;i++) {
        	if(list1.get(i)*2>list2.get(j)) {
        		j++;
        		count++;
        	}
        }
     
      System.out.println(count);
        scan.close();
    }

}

全部所有的子序列

全部所有的子序列

在这里插入图片描述

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
   public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int n=scan.nextInt();
       
        int[]arr=new int[n];
        HashSet<Integer> set=new HashSet<Integer>();
        for(int i=0;i<n;i++) {
            arr[i]=scan.nextInt();
            set.add(arr[i]);
        }
        int size=set.size();
        int len=(int)1e5;
        int l=0,r=0;//[)
        HashMap<Integer,Integer> window =new HashMap<Integer,Integer>();
        while(r<n) {
            //扩大窗口
            window.put(arr[r],window.getOrDefault(arr[r], 0)+1);
            r++;
            
            while(window.size()==size) {
                if(window.get(arr[l])==1){
                    break;
                }
                //可以缩小
                window.put(arr[l],window.get(arr[l])-1);
                l++;
                //更新
                if(len>r-l){
                    len=r-l;
                }
            }
        }
        if(len==100000){//注意:当序列为1 2 3 4 5 时,len=100000
        System.out.println(n);
        }else{
        System.out.println(len);
        }
        scan.close();
    }
}

http://www.kler.cn/a/531813.html

相关文章:

  • Maven jar 包下载失败问题处理
  • 【PDF提取局部内容改名】批量获取PDF局部文字内容改名 基于QT和百度云api的完整实现方案
  • deepseek接入pycharm 进行AI编程
  • 使用Visual Studio打包Python项目
  • 【Elasticsearch】硬件资源优化
  • 17.3.4 颜色矩阵
  • Vue3学习笔记-Vue开发前准备-1
  • Rust场景示例:为什么要使用切片类型
  • Deep Sleep 96小时:一场没有硝烟的科技保卫战
  • 即梦(Dreamina)技术浅析(三):数据库与存储
  • 手写单例模式
  • Java循环操作哪个快
  • bootstrap.yml文件未自动加载问题解决方案
  • 【回溯+剪枝】优美的排列 N皇后(含剪枝优化)
  • 【游戏设计原理】98 - 时间膨胀
  • SpringBoot 引⼊MybatisGenerator
  • 【C++ STL】vector容器详解:从入门到精通
  • IBM Cognos Analytics配置LTPA SSO单点登录
  • 【02】智能合约与虚拟机
  • Node 服务器数据响应类型处理
  • SLAM技术栈 ——《视觉SLAM十四讲》学习笔记(一)
  • c++ stl 遍历算法和查找算法
  • BMS和无刷电机产品拆解学习
  • TryHackMe: TryPwnMe Two
  • 使用递归解决编程题
  • 编程AI深度实战:AI编程工具哪个好? Copilot vs Cursor vs Cody vs Supermaven vs Aider