【數學】C081_LC_移動石子直到連續(腦筋急轉彎 + 分類討論)

一、Problem

三枚石子放置在數軸上,位置分別爲 a,b,c。

每一回合,我們假設這三枚石子當前分別位於位置 x, y, z 且 x < y < z。從位置 x 或者是位置 z 拿起一枚石子,並將該石子移動到某一整數位置 k 處,其中 x < k < z 且 k != y。

當你無法進行任何移動時,即,這些石子的位置連續時,遊戲結束。

要使遊戲結束,你可以執行的最小和最大移動次數分別是多少? 以長度爲 2 的數組形式返回答案:answer = [minimum_moves, maximum_moves]

a=3,b=5,c=1
預期:[1,2]

提示:

1 <= a <= 100
1 <= b <= 100
1 <= c <= 100
a != b, b != c, c != a

二、Solution

方法一:腦筋急轉彎

注:這裏的 a、b、c 不是升序給出的,所以要預處理一下,整體思路分類討論一下如下:

  • 最少移動:當兩兩石子的距離 > 1,只需要移動一次
  • 最多移動:當兩兩石子的距離 > 1,則需要 z-y-1 + y-x-1 = z-x-2 次
  • 特殊情況:當 a=3,b=5,c=1 時,只需要將 a 移動到 b、c 之間,即只需移動一次,這種情況就是 a、b 或者 b、c 之一隻相差一格
class Solution {
    public int[] numMovesStones(int a, int b, int c) {
        int x = Math.min(a, Math.min(b, c));
        int z = Math.max(a, Math.max(b, c));
        int y = a+b+c - x-z;
        
        int mi = (z-y > 1 ? 1 : 0) + (y-x > 1 ? 1 : 0), ma = z-x-2;
        if (z-y==2 || y-x == 2) mi = 1;
        return new int[]{mi, ma};
    }
}

複雜度分析

  • 時間複雜度:O(1)O(1)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章