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

算法刷题-2025年03月01日

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test_02_28 {
    //长度最小的子数组 找出总和大于等于target的长度最小的子数组
    //target = 7, nums = [2,3,1,2,4,3] [1.2.2.3.3.4]
    public static int test1(int[] nums, int target){
        //存储结果
        List<Integer> res = new ArrayList<>();

        Arrays.sort(nums);
        int sum = 0;
        for (int i=nums.length-1;i>=0;i--){
            if (sum>=target){
                return res.size();
            }else{
                res.add(nums[i]);
            }
            sum+=nums[i];
        }
        return 0;
    }

    //长度最小的子数组-要连续
    //[2,3,1,2,4,3] 7
    //滑动窗口解法
    public static int test2(int[] nums, int target){
        int i=0;
        int j=0;
        int n=nums.length;
        int sum=0;
        int res = n+1;
        while (j<n&&i<n){
            sum+=nums[j];
            //发现累加数小于 target 将j往右走 寻求累加
            if (sum<target){
                j++;
            }else {
                //发现累加数大于等于target 此时要考虑左边的i能不能往右边移动
                if (sum - nums[i] < target) {

                    System.out.println(res);
                    //不可以移动
                    //获取此时的值和原来的值做比较
                    res = Math.min(j - i + 1, res);
                }
                //继续下一轮
                sum = sum - nums[i];
                i++;
                j++;
            }
        }
        if (res==n+1){
            return 0;
        }else{
            return j-i+1;
        }
    }

    //长度最小的子数组 找出一个数组中值最大但是长度最小的子数组
    public static void test3(int[] arr, int target){
        int n = arr.length;
        //j用来一直往前走
        int j=0;
        int i=0;
        //存储最大值
        int max=0;
        //结果
        int res = n+1;
        //开始循环
        while (j<n){
            //找出
            if (max+arr[j]>=target){
                res=Math.min(res,j-i+1);
                System.out.println(res);
                //将其加上来
                if (max+arr[j]-arr[i]>=target){
                    max=max-arr[i];
                    i++;
                }else{
                    j++;
                }
            }else{
                max=max+arr[j];
                j++;
            }
        }
        System.out.println(res);
    }
    public static int test4(int[] arr, int target){
        int n=arr.length;
        int i=0;
        int j=0;
        int res = n+1;
        int max=0;
        while (j<n){
            max=max+arr[j];
            //获取结果
            while (i<=j&&max>=target){
                res=Math.min(res,j-i+1);
                max=max-arr[i];
                i++;
            }
            j++;
        }
        if (res==n+1){
            return 0;
        }else{
            return res;
        }
    }
    
    
    public static void main(String[] args) {
        test4(new int[]{1,2,3,4,5,6,7}, 7);
    }
}

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

相关文章:

  • Python使用pyobdc库和tkinter框架连接数据库
  • 蓝桥备赛(七)- 函数与递归(中)
  • 深度学习-12.变换器(Transformer)
  • 【Uniapp-Vue3】使用uniCloud.uploadFile上传图片到云存储
  • 青少年编程与数学 02-010 C++程序设计基础 13课题、数据类型
  • 九牧的“AI梦想曲”:卫浴场景进入到机器人时代
  • 【Java 后端】Restful API 接口
  • 高级算法分析与设计-分治法
  • 一个py文件搞定mysql查询+Json转换+表数据提取+根据数据条件生成excel文件+打包运行一条龙
  • Spring MVC框架六:Ajax技术
  • Redis面试常见问题——使用场景问题
  • React Portals深度解析:突破组件层级的渲染艺术
  • spring boot打包插件的问题
  • 【Mac】git使用再学习
  • Django应用的高级配置和管理
  • 【Python 数据结构 3.顺序表】
  • python | 2 个删除列表中空字符串元素的方法
  • 【GenBI优化】提升text2sql准确率:建议使用推理大模型,增加重试
  • The First项目报告:VANA如何重塑数据所有权与AI训练
  • Linux上用C++和GCC开发程序实现两个不同PostgreSQL实例下单个数据库中多个Schema稳定高效的数据迁移到其它PostgreSQL实例