LC-1033. 移动石子直到连续(分类讨论)
1033. 移动石子直到连续
当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。
要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves]
输入:a = 1, b = 2, c = 5
输出:[1, 2]
解释:将石子从 5 移动到 4 再移动到 3,或者我们可以直接将石子移动到 3。
输入:a = 4, b = 3, c = 2
输出:[0, 0]
解释:我们无法进行任何移动。
分类讨论
https://leetcode.cn/problems/moving-stones-until-consecutive/solution/tan-xin-ji-suan-pythoner-xing-100-1033-y-gj78/
class Solution:"""排序后,分类讨论1. 计算最大步数,最大步数:每次移动1个单位贪心:将a逐步移至b-1,c逐步移至b+1c - a - 22. 计算最小步数,分类讨论情形 判断条件 最小步数1 abc连续 a+2==c 02 ab连续 bc不连续 b==a+1 13 ab不连续 bc连续 b==c-1 14 ab差2 bc不连续[1,3,9] b==a+2 15 ab不连续 bc差2[1,7,9] b==c-2 16 其他 [1,5,8] 2"""def numMovesStones(self, a: int, b: int, c: int) -> List[int]:a, b, c = sorted([a, b, c])maxdis = c - a - 2mindis = infif a + 2 == c:mindis = 0elif b == a+1 or b == c-1 or b == a+2 or b == c-2:mindis = 1else: mindis = 2return mindis, maxdis
合并成一句
class Solution:def numMovesStones(self, a: int, b: int, c: int) -> List[int]:a, b, c = sorted([a, b, c])return 0 if a + 2 == c \else 1 if b in (a + 1, c - 1, a + 2, c - 2) \else 2, c - a - 2
拓展:如果有一万颗石子,该怎么做?
1040. 移动石子直到连续 II
在一个长度 无限 的数轴上,第 i
颗石子的位置为 stones[i]
。如果一颗石子的位置最小/最大,那么该石子被称作 端点石子 。
每个回合,你可以将一颗端点石子拿起并移动到一个未占用的位置,使得该石子不再是一颗端点石子。
值得注意的是,如果石子像 stones = [1,2,5]
这样,你将 无法 移动位于位置 5 的端点石子,因为无论将它移动到任何位置(例如 0 或 3),该石子都仍然会是端点石子。
当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。
要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves]
。
输入:[7,4,9]
输出:[1,2]
解释:
我们可以移动一次,4 -> 8,游戏结束。
或者,我们可以移动两次 9 -> 5,4 -> 6,游戏结束。
输入:[6,5,4,3,10]
输出:[2,3]
解释:
我们可以移动 3 -> 8,接着是 10 -> 7,游戏结束。
或者,我们可以移动 3 -> 7, 4 -> 8, 5 -> 9,游戏结束。
注意,我们无法进行 10 -> 2 这样的移动来结束游戏,因为这是不合要求的移动。
输入:[100,101,104,102,103]
输出:[0,0]
分类讨论(下跳棋)
题解:https://leetcode.cn/problems/moving-stones-until-consecutive-ii/solution/tu-jie-xia-tiao-qi-pythonjavacgo-by-endl-r1eb/
class Solution {/**最大移动次数:每次移动,让端点距离缩小1(下跳棋)最小移动次数:端点可以直接移动到中间任意空位,直接一步到位*/public int[] numMovesStonesII(int[] s) {Arrays.sort(s);int n = s.length;int e1 = s[n-2] - s[0] - n + 2; // 计算空位int e2 = s[n-1] - s[1] - n + 2;// 最大移动次数等于两种情况空位个数的最大值int maxMove = Math.max(e1, e2);if(e1 == 0 || e2 == 0){ // 特殊情况:没有空位return new int[]{Math.min(2, maxMove), maxMove};}int maxCnt = 0, left = 0;for(int right = 0; right < n; right++){ // 滑动窗口:枚举右端点while(s[right] - s[left] + 1 > n){ // 窗口大小大于 nleft++;}maxCnt = Math.max(maxCnt, right - left + 1); // 维护窗口内的最大石子数}return new int[]{n - maxCnt, maxMove};}
}
python
class Solution:def numMovesStonesII(self, stones: List[int]) -> List[int]:stones.sort()n = len(stones)e1 = stones[-2] - stones[0] - n + 2e2 = stones[-1] - stones[1] - n + 2# 最大移动次数等于两种情况空位个数的最大值max_move = max(e1, e2)if e1 == 0 or e2 == 0: # 特殊情况。没有空位return [min(2, max_move), max_move]max_cnt = left = 0for right, sr in enumerate(stones): # 滑动窗口:枚举右端点所在石子while sr - stones[left] + 1 > n: # 窗口长度大于 nleft += 1 # 缩小窗口长度max_cnt = max(max_cnt, right - left + 1) # 维护窗口内的最大石子数return [n - max_cnt, max_move]
0x3f
问: 你是如何想到本题的做法的? 是否有一些通用的思考方式?
答:个人觉得这题有点构造的味道 (想算出答案,要大致知道怎么移动石子) 。对于构造题,通常是先从最基本的情况开始思考,比如本题就是从 n = 3 开始思考。在纸上多画一画,比较不同的移动方案,猜想出一个大致的结论。接着思考 n = 4,5,…的情况,验证/修正你的结论。这就是 [从特殊到一般]。如果你想做更多的构造题,可以去 Codeforces 搜索 tag: constructive algorithms。
LC-1033. 移动石子直到连续(分类讨论)相关推荐
- LeetCode 1033. 移动石子直到连续
1. 题目 三枚石子放置在数轴上,位置分别为 a,b,c. 每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z. 从位置 x 或者是位置 z 拿起一枚石子 ...
- 【QOJ 4273】Good Game(分类讨论)(构造)
Good Game 题目链接:QOJ 4273 题目大意 给你一个 01 串,每次可以删一个长度为 2/3 的全 0 子串或者全 1 子串. 要你构造一种方法把串删空,或者输出无解. 思路 首先发现这 ...
- 1683. 困牛放牧(分类讨论)
文章目录 Question Ideas Code Question Farmer John 的三头获奖奶牛 Bessie.Elsie 和 Mildred,总是会迷路走到农场上遥远的地方去! 他需要你帮 ...
- 【BJOI2019】送别(平衡树)(大力分类讨论)
传送门 首先,我不知道为什么有这么多人在喷出题人,我觉得这道题作为防AK题就只有"部分分过少",或者说"部分分写法过于繁杂"这一个问题吧,而且出题人也在知乎上面 ...
- 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)
题目链接 题目大意: 就是两个人在坐标轴上面,有起始的坐标p1,p2p1,p2p1,p2,和速度v1,v2v1,v2v1,v2,问你访问完这长度为nnn的数轴最短时间是多少? 解题思路: 大佬有直接二 ...
- CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #694 (Div. 2) D 很好的一道数论思维题 D - Str ...
- Unfair contest 模拟-分类讨论
题意 : 两人比赛,n个裁判,给分范围[1,h][1, h][1,h],去掉s个最高分和t个最低分,给出n - 1个裁判的给分,第n个裁判想让第1个人赢,并且最小化给1的分数a[n]a[n]a[n] ...
- 2020ICPC(上海) - Walker(分类讨论+二分)
题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...
- 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)
[UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...
最新文章
- spring security remember me实现自动登录
- Win10打不开jar程序的解决方法 [转载]
- 安装Windows Storage Server 2008 R2
- 《挖财编程题》求数列的和
- 设计模式 - Composite
- Android之发送短信后按钮(60秒)变灰色每隔一秒递减显示
- [react-router] 在history模式中push和replace有什么区别?
- “黑天鹅”,正在改变 AI 落地医疗领域的加速度
- golang代理转发基础
- 华为交换机stp原理透析及实战
- (剑指Offer)面试题58:二叉树的下一个结点
- [Android 5.1] 多用户管理UserManager相关整理
- Java实现Unicode编码和中文互转
- cass生成里程文件桩号不全_怎样用CASS生成里程文件,带桩号的
- 学习强国十年磨剑最新分数及排名
- day40 ORM sqlalchemy
- 人工蜂群算法求解TSP旅行商问题C++(2020.11.13)
- 【JavaScript编写计算工资小程序】【表格细边框设置】【网页设计与网站开发HTML、CSS、JavaScript实例教程】【第十章】JavaScript基础——【传智播客】实验作业题【实验5】
- PhysX之旅(初章)--PhysXは虾米?
- HTML5与CSS3的新特性。
热门文章
- “知己知彼” 能做到“百战百胜吗”
- openpyxl模块介绍 ——更新(插入)excel表格 ——注意:最后要保存
- python 用画布组件画直方图_7招用Python画出酷酷的|散点直方图
- 2020年浙江大学软件学院预推免面经
- 解决layui轮播图满屏是高度自适应的问题
- 创意绝佳的格子广告网站“1百万像素网”
- javaweb百度云视频分享
- 常用硬件驱动网址(linux)
- DELL笔记本webcom摄像头问题解决方法
- (转)java 原码反码补码计算 以及 取反运算,原码反码补码运算公式