题目:

一个花园有N个位置。每个位置上有一朵花。这N朵花会在N天内逐一盛开。每天都一定会有并且只有一朵花盛开,从这天起,这朵花将一直处于盛开的状态。

给定一个由数字1N组成的数组flowers。数组中的每个数字表示那一天将会盛开的花的位置。

例如,flowers[i] = x表示在位置x上的花会在第i天盛开,其中ix都在1N的范围内。

还有,给出一个整数k,你需要返回,在哪一天,恰好有两朵花处于盛开的状态,并且两朵花之间恰好有k朵花没有盛开。

如果有多个答案,选择最小的。
如果不存在这样一天,那么返回-1。

  • 给定数组在[1, 20000]范围内。

样例 1:

输入:[1,2,3,4],k=1
输出:-1
解释:最先开放的两朵花相邻

样例 2:

输入:[1,3,2],k=1
输出:2
解释:在第二天,第一朵和第三朵花会开

分析:

给定一个开花序列,每天只开一朵花,求两朵花处于盛开时且他们之间恰好有k朵花没有盛开。

第一种思路就是,每开一朵花时,就相应的去检查它前k+1朵花和后k+1朵是否盛开,且他们之间没有花开,如果存在的话返回相应的天数即可。

第二种我们可以用一个有序集合存储每一个开花位置,每新加入到集合中,就检查前一个位置和后一个开花的位置是否符合要求。

第三种我们不存储所有开花位置,而是把开花的位置以K+1为单位分成若干和区间,每个区间只记录当前的最大位置和最小位置。同一个区间内的开花位置是不符合间隔k这个要求,每开一朵花,更新相应区间的最大位置和最小位置,如果是最大位置,那么仅有可能在下一个区间的最大位置符合当前要求,检查即可,同理,如果是最小位置,则仅可能在上一个区间的最小位置符合当前要求。

程序:

C++

class Solution {
public:
/**
* @param flowers: the place where the flower will open in that day
* @param k: an integer
* @return: in which day meet the requirements
*/
int kEmptySlots(vector<int> &flowers, int k) {
// Write your code here
int n = flowers.size();
if(k >= n || n == 0)
return -1;
set<int> flo;
for(int i = 0; i < n; ++i){
int x = flowers[i];
flo.insert(x);
auto l = flo.find(x);
auto r = l;
if(++r != flo.end() && *r == x + k + 1){
return i + 1;
}
if(l != flo.begin() && *(--l) == x - k - 1){
return i + 1;
}
}
return -1;
}
};
class Solution {
public:
/**
* @param flowers: the place where the flower will open in that day
* @param k: an integer
* @return: in which day meet the requirements
*/
int kEmptySlots(vector<int> &flowers, int k) {
// Write your code here
int n = flowers.size();
if (n == 0 || k >= n) return -1;
int bs = (n - 1) / (k + 1) + 1;
vector<int> higher(bs, INT_MIN);
vector<int> lower(bs, INT_MAX);
for(int i = 0; i < n; ++i){
int x = flowers[i];
int p = (x - 1) / (k + 1);
if (x < lower[p]) {
lower[p] = x;
if (p > 0 && higher[p - 1] == x - k - 1) return i + 1;
}
if (x > higher[p]) {
higher[p] = x;
if (p < bs - 1 && lower[p + 1] == x + k + 1) return i + 1;
}
}
return -1;
}
};

Java

public class Solution {
/**
* @param flowers: the place where the flower will open in that day
* @param k: an integer
* @return: in which day meet the requirements
*/
public int kEmptySlots(int[] flowers, int k) {
// Write your code here
int n = flowers.length;
if(k >= n || n == 0)
return -1;
TreeSet<Integer> flo = new TreeSet();
for(int i = 0; i < n; ++i){
int x = flowers[i];
flo.add(x);
Integer low = flo.lower(x);
Integer high = flo.higher(x);
if(low != null && low == x - k - 1)
return i+1;
if(high != null && high == x + k + 1)
return i+1;
}
return -1;
}
}
public class Solution {
/**
* @param flowers: the place where the flower will open in that day
* @param k: an integer
* @return: in which day meet the requirements
*/
public int kEmptySlots(int[] flowers, int k) {
// Write your code here
int n = flowers.length;
if (n == 0 || k >= n) return -1;
int bs = (n - 1) / (k + 1) + 1;
int[] higher = new int[bs];
int[] lower = new int[bs];
Arrays.fill(higher, Integer.MIN_VALUE);
Arrays.fill(lower, Integer.MAX_VALUE);
for(int i = 0; i < n; ++i){
int x = flowers[i];
int p = (x - 1) / (k + 1);
if (x < lower[p]) {
lower[p] = x;
if (p > 0 && higher[p - 1] == x - k - 1) return i + 1;
}
if (x > higher[p]) {
higher[p] = x;
if (p < bs - 1 && lower[p + 1] == x + k + 1) return i + 1;
}
}
return -1;
}
}

LeetCode 683. K Empty Slots K 个空花盆 / LintCode 861. K个空的位置 (C++/Java)的更多相关文章

  1. LC 683. K Empty Slots 【lock,hard】

    There is a garden with N slots. In each slot, there is a flower. The N flowers will bloom one by one ...

  2. 解题报告-683. K Empty Slots

    There is a garden with N slots. In each slot, there is a flower. The N flowers will bloom one by one ...

  3. [LeetCode] 683. K Empty Slots K个空槽

    There is a garden with N slots. In each slot, there is a flower. The N flowers will bloom one by one ...

  4. [LeetCode] K Empty Slots K个空槽

    There is a garden with N slots. In each slot, there is a flower. The N flowers will bloom one by one ...

  5. [LeetCode] Find K Pairs with Smallest Sums 找和最小的K对数字

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

  6. 【LeetCode】1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 Check If a String Contains All Binary Codes of Size K

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计长度为 K 的子串个数 日期 题目地址:https ...

  7. [Swift]LeetCode974. 和可被 K 整除的子数组 | Subarray Sums Divisible by K

    Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum ...

  8. [Swift]LeetCode992. K 个不同整数的子数组 | Subarrays with K Different Integers

    Given an array A of positive integers, call a (contiguous, not necessarily distinct) subarray of A g ...

  9. [Swift]LeetCode1015. 可被 K 整除的最小整数 | Smallest Integer Divisible by K

    Given a positive integer K, you need find the smallest positive integer N such that N is divisible b ...

  10. hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙

    /** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...

随机推荐

  1. vscode下的超级慢的解决方法

    vscode下的超级慢的解决方法 从网上看到的方法,记录给自己看 vscode官网:https://code.visualstudio.com/Download 复制下载链接 链接如下: https: ...

  2. 在IDEA中新建一个SpringBoot项目(两种方法)

    方法一.使用Spring initializr快速构建 1.首先创建一个新的project,点击[File]->[New]->[Project](如果是最开始进入idea软件界面,就是点击 ...

  3. 如何在 ACK 中使用 MSE Ingress

    简介: 本文将为大家分享一下 Ingress 标准 和 实现的趋势,介绍一下 MSE Ingress 在这个趋势下的优势和实践,为大家做关键入口选择多一些参考. 作者:彦林 随着云原生架构的普及,K8 ...

  4. 消息队列Kafka「检索组件」重磅上线!

    ​简介:本文对消息队列 Kafka「检索组件」进行详细介绍,首先通过对消息队列使用过程中的痛点问题进行介绍,然后针对痛点问题提出相应的解决办法,并对关键技术技术进行解读,旨在帮助大家对消息队列 Kaf ...

  5. 使用 Arthas 排查 SpringBoot 诡异耗时的 Bug

    简介: 公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑,主要是转换报文和参数校验之类的工作,起着一个承上启下的作用.最近,在优化接口的响应时间,优化了代码之后,但是时间还是达不到要求:有一个 ...

  6. 第二讲 Cadence建立工程和元件库

    第二讲 Cadence建立工程和元件库 1.创建工程,设置图纸参数.Design Entry CIS / Orcad Capture CIS / Option /Design Template,可以设 ...

  7. navicat15安装以及破解

    一. 下载 链接:https://pan.baidu.com/s/173rqp-DZJ3Om_QNN0NxbEg 提取码:zop2 二. 安装 2.1 解压刚才的文件 2.2 安装navicat15. ...

  8. 羽夏闲谈——NewCode

    前言   在工作学习中,我配置好了一个VSCode,学习C语言,需要经常性的创建代码文件,而往往这里面有一个固定的模板,比如下面: #define _CRT_SECURE_NO_WARNINGS #i ...

  9. 深入了解 Java 字节码

    1.1 什么是字节码? Java 在刚刚诞生之时曾经提出过一个非常著名的口号: "一次编写,到处运行(write once,run anywhere)",这句话充分表达了软件开发人 ...

  10. maven的环境配置

    将maven压缩包解压到一个空文件夹中.比如:D盘中的maven文件夹(D:\maven\apache-maven-3.6.3) 注意:路径中不要包含中文.空格.数字等字符 2.新建变量名: MAVE ...