【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心

简介: 【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心

移动石子直到连续【LC1033】

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

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

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

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

要赶紧回归学习状态

  • 思路排序后分类讨论
  • 最大移动次数贪心

           每次向中间十字移动一格,使移动次数最大

  • 最小移动次数【分情况讨论】由于可以移动至任意位置,因此最小次数最多为2
  • 如果三颗石子已经连续,那么不需要移动
  • 如果三颗石子两颗连续 ,那么只需移动1次
  • 如果两颗石子距离为1,那么只需移动1次
  • 否则,移动2次
  • 实现
class Solution {
    public int[] numMovesStones(int a, int b, int c) {
        int[] stones = {a, b, c};
        Arrays.sort(stones);
        int[] res = new int[2];
        res[1] = stones[2] - stones[0] - 2;// 最大
        // 最小
        // 已经连续 0次
        // 两颗连续 1次
        // 两颗相邻为1 1次
        // 否则 移动2次
        if(stones[2] - stones[0] == 2){
            res[0] = 0;
        }else if (stones[2] - stones[1] <= 2 || stones[1] - stones[0] <= 2){
            res[0] = 1;
        }else {
            res[0] = 2;
        }
        return res;
    }
}

复杂度

  • 时间复杂度:O(1)
  • 空间复杂度:O(1)
目录
相关文章
|
2月前
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
34 0
|
2月前
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
27 0
|
2月前
【每日一题Day272】LC1499满足不等式的最大值 | 单调队列 大顶堆
【每日一题Day272】LC1499满足不等式的最大值 | 单调队列 大顶堆
22 0
|
2月前
【每日一题Day170】LC1040移动石子直到连续 II | 双指针 贪心 数学
【每日一题Day170】LC1040移动石子直到连续 II | 双指针 贪心 数学
32 1
|
2月前
【每日一题Day265】LC979在二叉树中分配硬币 | 树形dp
【每日一题Day265】LC979在二叉树中分配硬币 | 树形dp
36 0
|
2月前
【每日一题Day261】LC16最接近的三数之和 | 双指针
【每日一题Day261】LC16最接近的三数之和 | 双指针
24 0
|
2月前
【每日一题Day306】LC228汇总区间 | 双指针
【每日一题Day306】LC228汇总区间 | 双指针
24 0
|
2月前
【每日一题Day122】LC1237找出给定方程的正整数解 | 双指针 二分查找
【每日一题Day122】LC1237找出给定方程的正整数解 | 双指针 二分查找
26 0
|
2月前
【每日一题Day223】LC1130叶值的最小代价生成树 | 贪心 区间dp
【每日一题Day223】LC1130叶值的最小代价生成树 | 贪心 区间dp
30 0
|
9月前
|
存储 人工智能 算法
剑指offer(C++)-JZ42:连续子数组的最大和(算法-动态规划)
剑指offer(C++)-JZ42:连续子数组的最大和(算法-动态规划)