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;
}
相关推荐
典典分享指南27 分钟前
VS Code Git 工作树:解锁多分支并行开发新体验
算法·决策树·逻辑回归·启发式算法
_Narcissus_1 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
天疆说1 小时前
策略的进化:从随心所欲到稳健前行
算法
冻柠檬飞冰走茶1 小时前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list
happyprince2 小时前
03-深刻观-CodeX哲学与升华(源码)
算法·ai编程
不会打球的王子2 小时前
Day 27:迁移学习与微调 — 站在巨人的肩膀上
算法
老当益壮梁奶奶2 小时前
Linux软件编程学习笔记(二)Linux文件IO编程入门:从fopen到fgetc
linux·c语言·c++·笔记·学习
sunoo-2292 小时前
C 语言文件 IO 全攻略:从基础函数到实战踩坑(BMP 读取 + 词典查询)
linux·c语言·前端·笔记·vscode·学习
数模竞赛Paid answer3 小时前
2025年中青杯数学建模A题康养城市建设求解全过程论文及程序
算法·数学建模·数据分析·中青杯
网安蟹佬霸3 小时前
密码学安全实战:从加密原理到哈希破解的完整攻防指南
网络·算法·安全·web安全·开源·密码学·哈希算法