题目:

一个花园有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. c#程序员必学清单补充

    作为 C# 程序员,除了上述经典书籍和开源框架外,还需要掌握以下技术: 1. .NET Core 和 ASP.NET Core:了解并熟练掌握 .NET Core 和 ASP.NET Core 框架, ...

  2. 微信小程序报错:Expecting 'STRING', got INVALID

    具体错误如下图: 这是因为在微信小程序的 app.json 文件中是不能包含有注释的,只需要把注释去掉就可以了.

  3. 力扣28(java)-实现 strStr()(简单)

    题目: 实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存 ...

  4. Apache ShenYu 网关正式支持 Dubbo3 服务代理

    简介: 本文介绍了如何通过 Apache ShenYu 网关访问 Dubbo 服务,主要内容包括从简单示例到核心调用流程分析,并对设计原理进行了总结. 作者:刘良 Apache Dubbo 在去年发布 ...

  5. 当 TiDB 与 Flink 相结合:高效、易用的实时数仓

    简介: 利用实时数仓,企业可以实现实时 OLAP 分析.实时数据看板.实时业务监控.实时数据接口服务等用途.但想到实时数仓,很多人的第一印象就是架构复杂,难以操作与维护.而得益于新版 Flink 对 ...

  6. [Rust] 在 Linux 和 Mac 安装 Rust

      首先,安装 rustup,这是一个 Rust 的安装程序. curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh cargo ...

  7. three.js实现相机碰撞,相机不穿墙壁、物体

    大家好,本文实现了相机碰撞检测,使相机不穿墙壁.物体,并给出了思路和代码,感谢大家~ 关键词:数字孪生.three.js.Web3D.WebGL.相机碰撞.游戏相机 我正在承接Web3D数字孪生项目, ...

  8. 在jeecg-boot中密码的使用

    1.生成密码并入库保存 String id= SnowflakeIdUtil.nextValue();//生成id operatCompany.setId(id); String salt = oCo ...

  9. C语言:算法题判断是否有效字符({[]})---括号

    给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效. 有效字符串需满足:                  左括号必须用相同类型的右括号闭合.       ...

  10. C 语言编程 — 编程实践

    目录 文章目录 目录 前文列表 程序示例 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> < ...