LeetCode //C - 1033. Moving Stones Until Consecutive

1033. Moving Stones Until Consecutive

There are three stones in different positions on the X-axis. You are given three integers a, b, and c, the positions of the stones.

In one move, you pick up a stone at an endpoint (i.e., either the lowest or highest position stone), and move it to an unoccupied position between those endpoints. Formally, let's say the stones are currently at positions x, y, and z with x < y < z. You pick up the stone at either position x or position z, and move that stone to an integer position k, with x < k < z and k != y.

The game ends when you cannot make any more moves (i.e., the stones are in three consecutive positions).

Return an integer array answer of length 2 where:

  • answer0 is the minimum number of moves you can play, and
  • answer1 is the maximum number of moves you can play.
Example 1:

Input: a = 1, b = 2, c = 5
Output: 1,2
Explanation: Move the stone from 5 to 3, or move the stone from 5 to 4 to 3.

Example 2:

Input: a = 4, b = 3, c = 2
Output: 0,0
Explanation: We cannot make any moves.

Example 3:

Input: a = 3, b = 5, c = 1
Output: 1,2
Explanation: Move the stone from 1 to 4; or move the stone from 1 to 2 to 4.

Constraints:
  • 1 <= a, b, c <= 100
  • a, b, and c have different values.

From: LeetCode

Link: 1033. Moving Stones Until Consecutive


Solution:

Ideas:
  • First sort the three positions so a < b < c.
  • Let the gaps be b-a and c-b.
  • Maximum moves = total empty spots between the outer stones = c - a - 2.
  • Minimum moves:
    • 0 if already consecutive.
    • 1 if one gap is 2 or less, because one move can make them consecutive.
    • otherwise 2.
Code:
c 复制代码
static void sort3(int *x, int *y, int *z) {
    int t;
    if (*x > *y) { t = *x; *x = *y; *y = t; }
    if (*y > *z) { t = *y; *y = *z; *z = t; }
    if (*x > *y) { t = *x; *x = *y; *y = t; }
}

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* numMovesStones(int a, int b, int c, int* returnSize) {
    sort3(&a, &b, &c);   // make sure a < b < c
    
    int *ans = (int *)malloc(sizeof(int) * 2);
    *returnSize = 2;
    
    int leftGap = b - a;
    int rightGap = c - b;
    
    /* maximum moves:
       keep shrinking the larger interval one step at a time */
    ans[1] = (c - a - 2);
    
    /* minimum moves */
    if (leftGap == 1 && rightGap == 1) {
        ans[0] = 0;              // already consecutive
    } else if (leftGap <= 2 || rightGap <= 2) {
        ans[0] = 1;              // one special jump can finish it
    } else {
        ans[0] = 2;              // otherwise need two moves
    }
    
    return ans;
}
相关推荐
文丑颜不良啊1 小时前
LeetCode2461~2480题目解析
java·leetcode
安妮细水长流2 小时前
ad7124
c语言·单片机
文丑颜不良啊2 小时前
LeetCode2441~2460题目解析
java·leetcode
文丑颜不良啊4 小时前
LeetCode2521~2540题目解析
java·leetcode
lisw054 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术5 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
Delightrs6 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
自信150413057596 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
文丑颜不良啊7 小时前
LeetCode2501~2520题目解析
java·leetcode