首页 > 其他分享 >659. 分割数组为连续子序列

659. 分割数组为连续子序列

时间:2023-03-02 21:06:24浏览次数:46  
标签:count end 元素 put 数组 序列 getOrDefault 659

给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个长度至少为 3 的子序列,其中每个子序列都由连续整数组成。

如果可以完成上述分割,则返回 true ;否则,返回 false 。

 

示例 1:

输入: [1,2,3,3,4,5]
输出: True
解释:
你可以分割出这样两个连续子序列 : 
1, 2, 3
3, 4, 5
示例 2:

输入: [1,2,3,3,4,4,5,5]
输出: True
解释:
你可以分割出这样两个连续子序列 : 
1, 2, 3, 4, 5
3, 4, 5

 

class Solution {
    public boolean isPossible(int[] nums) {
        /**
        贪心:
            开两个Hash表,然后一个存每个元素出现的数量,另一个放 当前元素作为子序列的结尾 的次数
                遍历灭一个元素,x
                    1 先看他的x-1连续子序列存在吗,存在的话让他的x-1子序列-1,当前元素作为末尾, x序列+1
                    2 不存在的话,让当前元素作为开头,看下他的x+1 x+2元素存在吗,
                        不存在,返回false
                        存在,让他们出现的次数都-1,x+2作为序列的末尾元素+1
         */

        Map<Integer,Integer> count=new HashMap();
         Map<Integer,Integer> end=new HashMap();

         for(int n:nums) count.put(n,count.getOrDefault(n,0)+1);//先放元素的次数

         for(int n:nums){
             if(count.getOrDefault(n,0)==0) continue;
             if(end.getOrDefault(n-1,0)>0){
                 //说名他前面存在连续 子序列  当前元素-1
                 count.put(n,count.getOrDefault(n,0)-1);
                 end.put(n-1,end.getOrDefault(n-1,0)-1);//让他的前一个元素作为结尾的序列-1
                 end.put(n ,end.getOrDefault(n ,0)+1);//让他的 作为结尾的序列+1
             }else{
                 //他前面不存在连续子序列
                 //自己作为开头
               if(count.getOrDefault(n+1,0)>0&&count.getOrDefault(n+2,0)>0){
                   //构造完毕 ,让他们出现的次数都-1,x+2作为序列的末尾元素+1
                   end.put(n+2,end.getOrDefault(n+2,0)+1);
                   count.put(n,count.getOrDefault(n,0)-1);
                   count.put(n+1,count.getOrDefault(n+1,0)-1);
                   count.put(n+2,count.getOrDefault(n+2,0)-1);
               }else{
                   //不能构造
                   return false;
               }
             }
         }
         return true;
    }
}

 

 

 

 

 

 

 

 

 

标签:count,end,元素,put,数组,序列,getOrDefault,659
From: https://blog.51cto.com/u_14689911/6096741

相关文章

  • lc.209 长度最小的子数组
    题目给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsl,numsl+1,...,numsr-1,numsr],并返回其......
  • 数组模拟环形数列
        ......
  • (板子)平衡树维护序列
    把之前文艺平衡树的板子稍微改了一下用来做别的板子题(luoguP4146序列终结者code:(读入等略)constintmaxn=50010;inttot,rt;structnode{intl,r,val,key,siz,maxx,......
  • 数组指针
    数组指针:本质是指针变量,保存的是数组的首地址例如:int(*p)[5]=NULL;数组首元素地址。例如:intarr[3]={10,20,30};  arr就是首元素地址(&arr[0]==arr),a......
  • [Go语言tips03]数组与切片与...语法糖
    0.引言C中只有数组的概念,没有切片的概念;Python中只有切片的概念,没有数组的概念;Go语言同时拥有数组和切片的概念,这两者看起来没什么区别都直接通过[x]int来使用,但实际上有......
  • Excel 数据转二维数组 JSON
    问题描述:偶尔会遇到读取Excel数据的场景如果是在网页中,可以上传文件然后处理(可借助js-xlsx等插件)如果有node服务,也可以使用类似的操作不过如果是在应用外,只是临......
  • leetcode2565. 最少得分子序列[题解]
    最少得分子序列给你两个字符串s和t。你可以从字符串t中删除任意数目的字符。如果没有从字符串t中删除字符,那么得分为0,否则:令left为删除字符中的最小下标。......
  • 找出多维数组最大值
       结果 ......
  • 洛谷P4051 [JSOI2007]字符加密 题解 后缀数组sa的应用
    题目链接:https://www.luogu.com.cn/problem/P4051题目大意:给定一个长度为\(n\)的字符串\(s\),每次将\(s\)的首字符取出放到末尾……这样能得到\(n\)个字符串。将......
  • 数组元素的指针变量
    数组元素的指针变量和数组名(作为地址)等价  在使用中,[]就是*()的缩写 为啥arr==&arr[0]&arr[0]==&*(arr+0)==arr+0==arr指向......