zoukankan      html  css  js  c++  java
  • 奇妙的算法【12】寻找符合规范的最大子序列

    问题:有一组无序的int整数数组,现在需要寻找符合下面规定的一个最长连续子序列:前面的数值之和小于等于下一个数值

    例如:0 1 1 2 4 8 100 这个就是符合规范的数组

    我在这里直接使用分治法求解:①先找出一个升序的子序列【如果为0可以相等】;②在这个子序列上面找到后面的符合规定的子子序列;

    package com.cnblogs.mufasa.help.MaxFormatSubLine1;
    
    import org.junit.Test;
    
    import java.util.Scanner;
    
    public class Main {
    
        public static int findFormat(int[] nums,int x,int y){//验证正确
            int len=1,sum=nums[x],index=x;
            int max=1;
            for(int i=1;i<=y-x;i++){
                if(nums[i+x]>=sum){//符合规范
    //                System.out.println(nums[i+x]);
                    sum+=nums[i+x];
                    len++;
                    if(len>max){
                        max=len;
                    }
                }else {//不符合规范,需要进行index光标移动处理
                    while (nums[i+x]<sum){
                        sum-=nums[index];
                        len--;
                        index++;
                    }
                }
            }
            return max;
        }
    
        public static int findSubLine(int[] nums,int x){//寻找一个升序子序列
            int y=x,Nlen=nums.length-1;
            while (y<Nlen&&nums[y]<=nums[y+1]){
                if(nums[y]==nums[y+1]&&nums[y]!=0){
                    break;
                }
                y++;
            }
            return y;
        }
    
        @Test
        public void test(){
            int[] nums={2,1 ,3 ,9 ,100 ,2 ,4 ,6 ,12 ,24 ,48 ,96};
    //        int[] nums={1 ,1 ,1 ,1 ,1};
            System.out.println(findFormat(nums,0,0));
            System.out.println(findFormat(nums,1,4));
            System.out.println(findFormat(nums,5,11));
    
            System.out.println(findSubLine(nums,0));
            System.out.println(findSubLine(nums,1));
            System.out.println(findSubLine(nums,4+1));
        }
    
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            int t=sc.nextInt();
            for(int i=0;i<t;i++){
                int len=sc.nextInt();
                if(len==0){
                    System.out.println(0);
                    continue;
                }
                int[] nums=new int[len];
                for(int j=0;j<len;j++){
                    nums[j]=sc.nextInt();
                }
    
                int x=0,y=0;//光标
                int max=0;
                while (x<len){
                    y=findSubLine(nums,x);
                    int preLen=y-x+1;
                    if(preLen>max){//小于直接跳过
                        int preFarLen=findFormat(nums,x,y);
                        if(preFarLen>max){
                            max=preFarLen;
                        }
                    }
                    x=y+1;
                }
                System.out.println(max);
            }
        }
    }
    
    /*
    2
    12
    2 1 3 9 100 2 4 6 12 24 48 96
    5
    4 2 9 16 7
    
    1
    5
    1 1 1 1 1
    
    1
    5
    1 1 2 3 1
    
    1
    5
    0 0 0 0 0
    
    2
    0
    5
    4 2 9 16 7
     */
  • 相关阅读:
    家长如何助力孩子适应小学生活
    一年级线上家长会
    gdb常用调试命令
    二叉树-后序遍历
    机器人
    Oracle创建只读账号的详细步骤
    ORACLE RAC日常运维-调整RAC+DG环境redo大小
    Redis 延迟分析
    oracle dataguard 重启步骤
    catalog start with + switch database to copy的妙用
  • 原文地址:https://www.cnblogs.com/Mufasa/p/11563756.html
Copyright © 2011-2022 走看看