第三十六天

1231 分享巧克力

你有一大块巧克力,它由一些甜度不完全相同的小块组成。我们用数组 sweetness 来表示每一小块的甜度。

你打算和 K 名朋友一起分享这块巧克力,所以你需要将切割 K 次才能得到K+1 块,每一块都由一些 连续 的小块组成。

为了表现出你的慷慨,你将会吃掉 总甜度最小 的一块,并将其余几块分给你的朋友们。

请找出一个最佳的切割策略,使得你所分得的巧克力 总甜度最大,并返回这个最大总甜度

方法

由于所有的巧克力必须连续分,我们可以使用二分搜索来确定答案,然后再通过具体相应判断算法来判断某一个答案是否合法。本题可以使用二分搜索答案的关键点在于,如果res是答案,那么比res大的一定不行,而比res小的一定也可以,它具有二段性。

因此,我们使用二分来找这个res,然后判断res是否可达,如果发现res可达,我们就尽可能的让res大,否则让res变小。直到我们找到答案为止。

对于一个答案是否可达,我们可以通过模拟切巧克力的过程,让切出来的大小在超过res并尽可能的靠近res,然后我们统计一下所切的巧克力的块数,如果超过了k+1块(分给k个朋友,自己也需要一块,所以需要k+1块)说明这个res是可以实现的,即可以分出k+1块,让每一块的大小不小于res

然后我们需要确定搜索的范围,容易知道搜索的左边界是整个巧克力数组的最小值,对于搜索的右边界,我们知道最极端的情况是k+1所分到的巧克力相同,因此右边界是所有巧克力总和除以k+1

class Solution {public int maximizeSweetness(int[] sweetness, int k) {int l = 1000000;int[] sumI = new int[sweetness.length + 1];for (int i = 0; i < sweetness.length; ++i){sumI[i + 1] = sweetness[i] + sumI[i];l = Math.min(l, sweetness[i]);//搜索的左边界}int r = sumI[sumI.length - 1] / (k + 1);//搜索的右边界//二分搜索答案while (l <= r){int mid = (l + r) >> 1;if (isOk(sumI, mid, k + 1)) l = mid + 1;//如果能够满足 我们尝试调大else  r = mid - 1;//不能满足 调小一点}return r;//返回能够满足的最大值}public boolean isOk(int[] sum, int target, int nums){int count = 0;int s = 0, e = 1;//模拟切巧克力while (e < sum.length){if (sum[e] - sum[s] < target) e++;else{count++; //超过了target 切下一块 统计块数s = e;e++;}}return count >= nums; //能不能切出k+1块}
}

1182 与目标颜色的距离

给你一个数组 colors,里面有 123 三种颜色。

我们需要在 colors 上进行一些查询操作 queries,其中每个待查项都由两个整数 ic 组成。

现在请你帮忙设计一个算法,查找从索引 i 到具有目标颜色 c 的元素之间的最短距离。

如果不存在解决方案,请返回 -1

方法

和上一题的思路大致相同,我们可以二分搜索这个最短距离,因为这个最短距离是具有二段性的,如果最短距离是distance,那么小于distance的一定不行,而大于等于distance的一定可以。我们使用二分去搜索这个最短距离,注意距离是双向的,因此左右都要找。

class Solution {public List<Integer> shortestDistanceColor(int[] colors, int[][] queries) {ArrayList<Integer> res = new ArrayList<>();Map<Point, Integer> map = new HashMap<>();for (int[] query : queries){if (map.containsKey(new Point(query))){res.add(map.get(new Point(query)));continue;} int l = 0, r = Math.max(colors.length - query[0] - 1, query[0]);//确定搜索范围 左边界是0 右边界是到数组开头 和 尾部两者距离中的最大值boolean flag = false;while (l <= r){int mid = (l + r) >> 1;if (isOk(colors, mid, query[0], query[1])) {r = mid - 1;flag = true;}else l = mid + 1;}int ans = flag ? l : -1;res.add(ans);map.put(new Point(query), ans);}return res;}//判断在所给的distance内能不能找到答案public boolean isOk(int[] colors, int distance, int start, int target) {for (int i = 0; i <= distance; ++i){int count = 0;if (start + i < colors.length){if (colors[start + i] == target) return true;count++;}if (start - i >= 0){if (colors[start - i] == target) return true;count++;}if (count == 0) break;}return false;}
}class Point{int x;int y;Point(int[] a){x = a[0]; y = a[1];}@Override public boolean equals(Object p){Point cmp = (Point) p;return cmp.x == x && cmp.y == y;}@Override public int hashCode(){return x | y;}
}

【leetcode刷题第36天】1231.分享巧克力、1182.与目标颜色的距离相关推荐

  1. 【leetcode刷题】36.提莫攻击——Java版

    ⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 我建议加上攻速,攻击力,生命回复速率,护甲,魔抗,血量,计算在攻击频率下提莫几秒弄死艾希 --leetcode此题热评 前言 哈喽 ...

  2. LeetCode刷题(36)--Text Justification

    cur存储当前正在处理的行的单词 通过模余处理空格. for i in range(maxWidth - cnt):cur[i%(len(cur)-1 or 1)] += ' ' 代码如下 res, ...

  3. LeetCode刷题——36.有效的数独

    文章目录 面试刷题第二天 LeetCode刷题--36.有效的数独 1.题目描述 2.解题思路(一) 3.解题思路(二) 面试刷题第二天 LeetCode刷题--36.有效的数独 1.题目描述 请你判 ...

  4. c语言贪心算法合并箭,LeetCode刷题题库:贪心算法

    LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...

  5. C#LeetCode刷题-剑指Offer

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-剑指Offer | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode剑指Offer ...

  6. C#LeetCode刷题-队列

    队列篇 # 题名 刷题 通过率 难度 363 矩形区域不超过 K 的最大数值和 27.2% 困难 621 任务调度器 40.9% 中等 622 设计循环队列 C#LeetCode刷题之#622-设计循 ...

  7. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% 困难 33 ...

  8. C#LeetCode刷题-设计

    设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制 33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索树迭 ...

  9. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 22.2% ...

最新文章

  1. mongo实现消息队列
  2. 安谋中国发布“玲珑”i3i5 ISP处理器,剑指何方?
  3. bzoj 4547: Hdu5171 小奇的集合
  4. NHibernate简介
  5. FFMpeg中apiexample.c例子分析——编码分析
  6. 【51Nod - 1117 】聪明的木匠 (贪心,哈夫曼树,时光倒流)
  7. gpio驱动蜂鸣器出现破音_五款蜂鸣器驱动电路原理图
  8. EXT学习经验分享:深刻理解EXT与服务器端的交互
  9. 【zookeeper系列】centos7安装zookeeper
  10. 中高级PHP程序员应该掌握哪些技术
  11. ***NSFileManager
  12. 【脑电数据十折交叉验证】实现对数据自动划分训练集与测试集得出平均分类准确率
  13. 服务器pci-e硬盘,来一发干货,PCI-E SSD硬盘使用须知
  14. 广州华龙展贸考场——科目三
  15. 视觉SLAM十四讲 第7讲 (3) 相机运动估计 2D-2D/3D-2D/3D-3D
  16. 使用matlab计算变上限积分,matlab含有变上限积分参数的非线性回归
  17. 调节笔记本外接显示器亮度
  18. uniapp开发:uniapp之vue3.2开发页面传值的解决方案
  19. Unity Shaders and Effects Cookbook (7-2) Surface Shader 中实现 顶点动画
  20. texstudio: 无法启动buildview:Xelate: xelatex.exe -synctex=1 -interacion=nonstopmode

热门文章

  1. Magento 和 WordPress 的区别
  2. 跨网段扫描 ip扫描
  3. MSYS2 Windows软件分发和构建平台
  4. 叶树:任总喊你回家吃饭 (zz)
  5. 利用ps制作流线高光线条发光效果
  6. [AppDelegate window]: unrecognized selector sent to instance 0x600002b178e0
  7. SpringCloud-Ribbon负载均衡
  8. Java - 生成二维码图片
  9. CCF201409-1 相邻数对(100分)
  10. .zip 文件和 .tar.gz文件 的区别