Leetcode1296划分数组为连续数字的集合
解法1:
最暴力的方法,存每个数字出现的次数,排序之后,扫一遍,对于每个数字,看它后面连续的k-1个是否都存在。
耗时:404ms
class Solution {
public:
bool isPossibleDivide(vector<int>& nums, int k) {
map<int,int> mp;
for(int v:nums){
mp[v]++;
}
sort(nums.begin(),nums.end());
bool ans=true;
for(int v:nums){
if(!mp[v]){
continue;
}else{
for(int i=1;i<k;i++){
if(!mp[v+i]){
ans=false;
break;
}
}
if(!ans){
break;
}else{
for(int i=0;i<k;i++){
mp[v+i]--;
}
}
}
}
return ans;
}
};
解法2:
debug了1个小时...果然不会写代码了。
用k个指针来指向当前正确的(连续)k个数,然后每次尝试往后移1位,判断是否有不满足的。
耗时:108ms
class Solution {
public:
bool isPossibleDivide(vector<int>& nums, int k) {
int len=nums.size();
cout << len << endl;
if(len%k){
return false;
}
int vis[len+5]={0};
sort(nums.begin(),nums.end());
int tag[k+5]={-1};
tag[0]=0;
vis[tag[0]]=1;
for(int i=1;i<k;i++){
for(int j=tag[i-1]+1;j<len;j++){
if(nums[j]==nums[tag[i-1]]+1){
tag[i]=j;
break;
}
}
if(tag[i]==-1){
return false;
}
vis[tag[i]]=1;
}
while(true){
tag[0]++;
while(vis[tag[0]] && tag[0]+1<len){
tag[0]++;
}
if(vis[tag[0]]){
break;
}
vis[tag[0]]=1;
for(int i=1;i<k;i++){
tag[i]=max(tag[i],tag[i-1])+1;
while(tag[i]+1<len && (nums[tag[i]]!=nums[tag[i-1]]+1 || vis[tag[i]])){
tag[i]++;
}
if(nums[tag[i]]!=nums[tag[i-1]]+1 || vis[tag[i]]){
return false;
}
vis[tag[i]]=1;
}
}
for(int i=0;i<len;i++){
if(!vis[i]){
return false;
}
}
return true;
}
};
Leetcode1296划分数组为连续数字的集合的更多相关文章
- PHP 重置数组为连续数字索引的几种方式
原文链接:https://blog.csdn.net/zhang197093/article/details/78606916 推荐的方式 array_values 方法 这样方式无论对普通数组还是 ...
- leetcode-168周赛-1296-划分数字为连续数字的集合
题目描述: 自己的提交: class Solution: def isPossibleDivide(self, nums: List[int], k: int) -> bool: c = col ...
- 找出数组中最长的连续数字序列(JavaScript实现)
原始题目: 给定一个无序的整数序列, 找最长的连续数字序列. 例如: 给定[100, 4, 200, 1, 3, 2], 最长的连续数字序列是[1, 2, 3, 4]. 小菜给出的解法: functi ...
- 4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。 (2)把数组中的数字放到当前文件夹的numArr.txt文件中
package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayLis ...
- Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
分析以下需求,并用代码实现 1.定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的 2.利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序 3 ...
- 剑指Offer面试题:7.旋转数组的最小数字
一.题目:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2 ...
- js-FCC算法Smallest Common Multiple。找出两个参数和它们之间的连续数字的最小公倍数。
存档. 找出能被两个给定参数和它们之间的连续数字整除的最小公倍数. function smallestCommons(arr) { //分解质因数法,分解为若干个质数相乘 var arrratio=[ ...
- Task 4 求数组的连续子数组的最大和(团队合作)
小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变 ...
- LeetCode——数组篇:659. 分割数组为连续子序列
659. 分割数组为连续子序列 输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数.返回你是否能做出这样的分割? 示例 1: 输入: [ ...
随机推荐
- 权值线段树+动态开点[NOI2004]郁闷的出纳员
#include<iostream> #include<stdio.h> #include<algorithm> #include<string.h> ...
- oralce 分离表和索引
总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上. “同时 ...
- hdu 4430 Yukari's Birthday (简单数学 + 二分)
Problem - 4430 题意是,给出蜡烛的数量,要求求出r和k,r是蜡烛的层数,k是每一层蜡烛数目的底数. 开始的时候,没有看清题目,其实中间的那根蜡烛是可放可不放的.假设放置中间的那根蜡烛,就 ...
- springmvc url处理映射的三种方式:
一.SpringMVC简介 SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,并管理应用所需对象 ...
- Java Integer类的缓存
首先看一段代码(使用JDK 5),如下: public class Hello { public static void main(String[] args) { int a = 1000, b = ...
- BZOJ 4034"树上操作"(DFS序+线段树)
传送门 •题意 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的 ...
- 2019-10-19-dotnet-给MatterMost订阅RSS博客
title author date CreateTime categories dotnet 给MatterMost订阅RSS博客 lindexi 2019-10-19 08:12:36 +0800 ...
- H3CSTP、RSTP的问题
- 2019-7-29-win10-uwp-如何使用DataTemplate
title author date CreateTime categories win10 uwp 如何使用DataTemplate lindexi 2019-7-29 10:2:32 +0800 2 ...
- CodeForce - 1189 D1. Add on a Tree (思维题)
Note that this is the first problem of the two similar problems. You can hack this problem only if y ...