LeetCode 683. K Empty Slots K 个空花盆 / LintCode 861. K个空的位置 (C++/Java)
题目:
一个花园有N个位置。每个位置上有一朵花。这N朵花会在N天内逐一盛开。每天都一定会有并且只有一朵花盛开,从这天起,这朵花将一直处于盛开的状态。
给定一个由数字1到N组成的数组flowers。数组中的每个数字表示那一天将会盛开的花的位置。
例如,flowers[i] = x表示在位置x上的花会在第i天盛开,其中i和x都在1到N的范围内。
还有,给出一个整数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)的更多相关文章
- 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 ...
- 解题报告-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 ...
- [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 ...
- [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 ...
- [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 ...
- 【LeetCode】1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 Check If a String Contains All Binary Codes of Size K
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计长度为 K 的子串个数 日期 题目地址:https ...
- [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 ...
- [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 ...
- [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 ...
- hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙
/** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...
随机推荐
- nuxt按需引入组件库(却加载所有图标问题),nuxt性能优化。
做一个官网,nuxt按需引入了antd_vue组件库,但是项目打包时,图标却又500K+,经过排查,发现icon和其他组件环环相扣的.如下:(我引入了这个翻页的组件,里面包含了两个翻页的图标) 但是它 ...
- 逸仙电商Seata企业级落地实践
简介: 本文将会以逸仙电商的业务作为背景, 先介绍一下seata的原理, 并给大家进行线上演示, 由浅入深去介绍这款中间件, 以便读者更加容易去理解 Seata 这个中间件. 作者 | 张嘉伟(Git ...
- 函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码
简介: 本文会以惰性加载为例一步步介绍函数式编程中各种概念,所以读者不需要任何函数式编程的基础,只需要对 Java 8 有些许了解即可. 作者 | 悬衡 来源 | 阿里技术公众号 本文会以惰性加 ...
- [FAQ] swagger-php 支持 Authorization Bearer token 校验的用法
@OA\SecurityScheme 可以是 Controller 层面也可以是 Action 层面. 类型 type="apiKey". in="header" ...
- Unity 热更--AssetBundle学习笔记 0.7
AssetBundle AB包是什么? AssetBundle又称AB包,是Unity提供的一种用于存储资源的资源压缩包. Unity中的AssetBundle系统是对资源管理的一种扩展,通过将资源分 ...
- AI实战 | 手把手带你打造智能待办助手
背景 大家好,我是努力的小雨.今天我想分享一下搭建待办助手的经历.起初,我并没有什么特别的创意点子.但在4月16日的百度Create大会上,我看到了小度的大模型加持使得其变得更加智能.我被一场示例所震 ...
- WebKist Inside: CSS 样式表的组成
1 StyleSheet 一张 StyleSheet 由一系列 Rules 组成,这些 Rules 可以分成 2 大类: 1 Style Rule 2 At-Rule 下面的例子展示了 Style R ...
- Java面试题:@PostConstruct、init-method和afterPropertiesSet执行顺序?
在Spring框架中,@PostConstruct注解.init-method属性.以及afterPropertiesSet()方法通常用于初始化Bean的逻辑.它们都提供了在Bean创建和初始化完成 ...
- threejs的坐标渲染和着色
点击查看代码 function createBasic() { // 目标:了解顶点坐标绘制正方形 // 1. 准备 BufferGemotry 缓冲几何图形 // 2. 准备 32 位浮点数的数组, ...
- C 编程异常 — /usr/bin/ld: 找不到 -lm
问题:在编程程序的时候报错. /usr/bin/ld: 找不到 -lm /usr/bin/ld: 找不到 -lc 原因:缺少库文件. 解决: yum install -y libstdc++-stat ...