LC-1033. 移动石子直到连续(分类讨论)

这篇具有很好参考价值的文章主要介绍了LC-1033. 移动石子直到连续(分类讨论)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1033. 移动石子直到连续

难度中等50

三枚石子放置在数轴上,位置分别为 abc

每一回合,你可以从两端之一拿起一枚石子(位置最大或最小),并将其放入两端之间的任一空闲位置。形式上,假设这三枚石子当前分别位于位置 x, y, zx < y < z。那么就可以从位置 x 或者是位置 z 拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < zk != y

当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。

要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves]

示例 1:

输入:a = 1, b = 2, c = 5
输出:[1, 2]
解释:将石子从 5 移动到 4 再移动到 3,或者我们可以直接将石子移动到 3。

示例 2:

输入:a = 4, b = 3, c = 2
输出:[0, 0]
解释:我们无法进行任何移动。

提示:

  1. 1 <= a <= 100
  2. 1 <= b <= 100
  3. 1 <= c <= 100
  4. a != b, b != c, c != a

分类讨论

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+1
        c - a - 2

    2. 计算最小步数,分类讨论
            情形            判断条件   最小步数
        1 abc连续           a+2==c       0
        2 ab连续 bc不连续    b==a+1       1
        3 ab不连续 bc连续    b==c-1       1
        4 ab差2 bc不连续[1,3,9] b==a+2    1
        5 ab不连续 bc差2[1,7,9] b==c-2    1
        6 其他 [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 - 2
        mindis = inf
        if a + 2 == c:
            mindis = 0
        elif b == a+1 or b == c-1 or b == a+2 or b == c-2:
            mindis = 1
        else: mindis = 2
        return 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

难度中等214

在一个长度 无限 的数轴上,第 i 颗石子的位置为 stones[i]。如果一颗石子的位置最小/最大,那么该石子被称作 端点石子

每个回合,你可以将一颗端点石子拿起并移动到一个未占用的位置,使得该石子不再是一颗端点石子。

值得注意的是,如果石子像 stones = [1,2,5] 这样,你将 无法 移动位于位置 5 的端点石子,因为无论将它移动到任何位置(例如 0 或 3),该石子都仍然会是端点石子。

当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。

要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:answer = [minimum_moves, maximum_moves]

示例 1:

输入:[7,4,9]
输出:[1,2]
解释:
我们可以移动一次,4 -> 8,游戏结束。
或者,我们可以移动两次 9 -> 5,4 -> 6,游戏结束。

示例 2:

输入:[6,5,4,3,10]
输出:[2,3]
解释:
我们可以移动 3 -> 8,接着是 10 -> 7,游戏结束。
或者,我们可以移动 3 -> 7, 4 -> 8, 5 -> 9,游戏结束。
注意,我们无法进行 10 -> 2 这样的移动来结束游戏,因为这是不合要求的移动。

示例 3:

输入:[100,101,104,102,103]
输出:[0,0]

提示:

  • 3 <= stones.length <= 10^4
  • 1 <= stones[i] <= 10^9
  • stones[i] 的值各不相同。

分类讨论(下跳棋)

题解: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){ // 窗口大小大于 n
                left++;
            }
            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 + 2
        e2 = 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 = 0
        for right, sr in enumerate(stones):  # 滑动窗口:枚举右端点所在石子
            while sr - stones[left] + 1 > n:  # 窗口长度大于 n
                left += 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。文章来源地址https://www.toymoban.com/news/detail-430422.html

到了这里,关于LC-1033. 移动石子直到连续(分类讨论)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

    图论 分类讨论 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1 = i n ,都存在一条街道连接编号为 i 的房屋与编号为 i + 1 的房屋。另存在一条街道连接编

    2024年04月13日
    浏览(32)
  • 【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目

    【动态规划】【数学】【C++算法】18赛车 差分数组 图论 分类讨论 整除以2 给你三个 正整数 n 、x 和 y 。 在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1 = i n ,都存在一条街道连接编号为 i 的房屋与编号为 i + 1 的房屋。另存在一条街道连接编号为 x 的房屋与

    2024年01月22日
    浏览(37)
  • 移动烽火HG680-LC_S905L3_安卓9.0_纯净线刷救砖固件

    特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、三网通用; 4、大量精简内置的没用的软件,运行速度提升,多出大量的存储空间; 5、支持蓝牙语音 6、支持开机自启动、开机密码锁、儿童应用锁、应用隐藏、开机自动进入HD

    2024年02月04日
    浏览(55)
  • 【VRTK】【VR开发】【Unity】10-连续移动

    https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 连续移动与瞬移有如下不同: 连续移动不容易打断沉浸 对于新手或者不适应者来说更容易晕动 我对玩家的建议:连续移动前后左右可以用摇杆,转向用自己物理转向不容易晕动且有最佳沉浸感。 这次采用与之前

    2024年02月02日
    浏览(47)
  • 湘大 XTU OJ 1290 Alice and Bob 题解(非常详细):字符串 分类讨论 简单模拟

    1290 Alice and Bob Alice和Bob玩剪刀-石头-布的游戏 ,请你写个程序判断一下比赛的结果。 第一行是一个整数K,表示样例的个数。 以后每行两个单词, rock表示石头,paper表示布,scissors表示剪刀 。 前面一个单词是Alice出的拳,后面一个单词是Bob出的拳。 平局输出\\\"Draw\\\",否则输出

    2024年02月13日
    浏览(37)
  • Arcgis连续数据的分类(求不同值域的面积)

    问题描述:如果得到的一个连续的影响数值数据,但是我们想求取某一段值域的面积占比,需要进行以下操作: 1.按照数值重分类,将某段数值变成一个类别 2.栅格转矢量,再求取面积    

    2024年02月12日
    浏览(47)
  • Matlab:连续按键、移动鼠标、鼠标点击、鼠标连点、输入字符,10行代码即可。

    Matlab 也可以实现 按键J灵 的一些基本功能,比如: 连续按键、移动鼠标、鼠标点击、鼠标连点和输入字符! 其中, “连续按键” :指间隔一定的时间(如:0.1s)按一下某个按键(如:键盘上的A键)。这个在游戏挂机时,用做 卡键练技能 很有效,而且使用Matlab语言 能避免

    2024年02月09日
    浏览(56)
  • leetcode分类刷题:哈希表(Hash Table)(四、前缀和 处理连续子数组)

    1、leetcode题目里对于 元素加和 的考察可谓是屡见不鲜,包括 简单的限定一个有效答案 的两个或多个元素求和leetcode分类刷题:哈希表(Hash Table)(一、简单的两数之和)、在有序数组内对加和等于target的 三元组、四元组 等的求解leetcode分类刷题:基于数组的双指针(三、

    2024年02月10日
    浏览(38)
  • 小程序分类如何移动顺序

    小程序的分类排序功能可以帮助商家根据自己的需求来调整展示在前端页面上的分类顺序,以便更好地呈现商品和提升用户体验。下面将介绍如何在小程序中进行分类移动顺序的操作步骤。 在小程序管理员后台-分类管理,可以看到所有的分类。 向上移动分类:找到需要移动

    2024年02月15日
    浏览(28)
  • 前端移动端开发分类及跨平台开发框架简述

    前端移动端主流分为以下三种:Native App ,Hybrid App ,Web App 优点: (1)用户体验好 (2)性能稳定 (3)操作速度快 (4)能够访问本地资源(通讯录,相册) (5)能够设计出色的动效,转场 (6)拥有系统级别的贴心通知或提醒 (7)用户留存率高 缺点: (1)开发成本高

    2024年02月04日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包