这是小川的第386次更新,第414篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第247题(顺位题号是1033)。在abc位置的数字线上有三块石头。每次,你在一个终点(即最低或最高位置的石头)上拾取一块石头,然后将它移动到这些终点之间的空置位置。

形式上,假设石头当前位于xyz位置,x <y <z。你在x位置或z位置拾取石头,然后将石头移动到整数位置kx <k <zk!= y

当你不能做任何移动时,游戏结束。例如,当石头处于连续的位置时。

当游戏结束时,你可以做出的最小和最大移动次数是多少?将答案作为长度为2的数组返回:answer = [minimum_moves,maximum_moves]

例如:

输入:a = 1,b = 2,c = 5

输出:[1,2]

说明:将石头从5移动到3,或将石头从5移动到4到3。

输入:a = 4,b = 3,c = 2

输出:[0,0]

说明:不能做任何移动。

输入:a = 3,b = 5,c = 1

输出:[1,2]

说明:将石头从1移动到4;或将石头从1移动到2到4。

注意

  • 1 <= a <= 100

  • 1 <= b <= 100

  • 1 <= c <= 100

  • a != b,b != c,c != a

02 解题

先将三个数排序,找出最小值min,中间值mid,最大值max

最小移动步数:既然要移动的步数最少,那就跳着移动,向中间值mid靠拢。

如果三个数都相邻,那么就不需要跳。

如果其中有两个数相邻,即最小值和中间值相邻,或者中间值和最大值相邻,那么就只需要跳一步即可。

如果三个数不相邻,分两种情况:

  • 第一,如果最大值与中间值相差2,那么只需要跳一步,将最小值跳到最大值与中间值之间即可;如果中间值与最小值相差2,那么只需要跳一步,将最大值跳到中间值与最小值之间即可。

  • 第二,任意两数的差值大于2,那就往中间数左右两边相邻的数字上跳,左右两边各跳一次即可。

最多移动步数:既然要移动的步数最多,那就一次只移动一次,向中间值mid靠拢。

最大值max向左移动,移动到mid+1的位置,一共移动了max-mid-1步。

最小值min向右移动,移动到mid-1的位置,一共移动了mid-min-1步。

因此,最多移动步数为(max-mid-1)+(mid-min-1) = max - min - 2

public int[] numMovesStones(int a, int b, int c) {
int max = Math.max(a, Math.max(b, c));
int min = Math.min(a, Math.min(b, c));
int mid = a + b + c - max - min;
int min_moves = Math.min(1, mid-min-1) +
Math.min(1, max-mid-1);
if (mid-min == 2 || max-mid == 2) {
min_moves = 1;
}
int max_moves = max - min - 2;
return new int[]{min_moves, max_moves};
}

03 小结

算法专题目前已连续日更超过七个月,算法题文章253+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.1033-移动石头直到连续(Moving Stones Until Consecutive)的更多相关文章

  1. [Swift]LeetCode1033. 移动石子直到连续 | Moving Stones Until Consecutive

    Three stones are on a number line at positions a, b, and c. Each turn, let's say the stones are curr ...

  2. 【Leetcode_easy】1033. Moving Stones Until Consecutive

    problem 1033. Moving Stones Until Consecutive 参考 1. Leetcode_easy_1033. Moving Stones Until Consecut ...

  3. 【LeetCode】1033. Moving Stones Until Consecutive 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 脑筋急转弯 日期 题目地址:https://leet ...

  4. LeetCode~1033.移动石子直到连续

    1033.移动石子直到连续 三枚石子放置在数轴上,位置分别为 a,b,c. 每一回合,我们假设这三枚石子当前分别位于位置 x, y, z 且 x < y < z.从位置 x 或者是位置 z ...

  5. 【leetcode】1033. Moving Stones Until Consecutive

    题目如下: Three stones are on a number line at positions a, b, and c. Each turn, you pick up a stone at ...

  6. leetcode_1033. Moving Stones Until Consecutive

    https://leetcode.com/problems/moving-stones-until-consecutive/ 题意:给定3个点,每次从两个端点(位置最小或位置最大)中挑选一个点进行移动 ...

  7. 滑动窗口-Moving Stones Until Consecutive II

    2020-02-20 16:34:16 问题描述: 问题求解: public int[] numMovesStonesII(int[] stones) { int n = stones.length; ...

  8. C#LeetCode刷题之#771-宝石与石头(Jewels and Stones)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3812 访问. 给定字符串J 代表石头中宝石的类型,和字符串 S代 ...

  9. [Leetcode 771]宝石和石子 Jewels and Stones HashSet简单应用

    [题目] You're given strings J representing the types of stones that are jewels, and S representing the ...

随机推荐

  1. [易学易懂系列|rustlang语言|零基础|快速入门|(14)|Impls & Traits实现与特征]

    [易学易懂系列|rustlang语言|零基础|快速入门|(14)] 有意思的基础知识 Impls & Traits实现与特征 我之前说到的struct结构体,其实就类似于面向对象语言中的类cl ...

  2. 使用pdo,使用pdo无法插入数据怎么办

    如果你使用了最新版的XAMPP,那么你几乎不用改变php.ini的设置,就可以使用pdo but,插了一晚上,程序既不报错也不插入数据,真是气死人,后来发现是实例化pdo对象的时候没有指定字符集.所以 ...

  3. (转载)搜索引擎的Query自动纠错技术和架构详解

    from http://www.52nlp.cn/%E8%BE%BE%E8%A7%82%E6%95%B0%E6%8D%AE%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E7 ...

  4. sklearn学习一

    转发说明:by majunman    from HIT    email:2192483210@qq.com 简介:scikit-learn是数据挖掘和数据分析的有效工具,它建立在 NumPy, S ...

  5. 插入排序,选择排序,冒泡排序等常用排序算法(java实现)

    package org.webdriver.autotest.Study; import java.util.*; public class sort_examp{ public static voi ...

  6. ie文件断点续传

    一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...

  7. 51 Nod 1242 矩阵快速幂求斐波那契数列

    #include<bits/stdc++.h> #define mod 1000000009 using namespace std; typedef long long ll; type ...

  8. jQuery_插入操作

    jQuery的插入方法有很多,有内部插入,也有外部插入,每个插入方式里面还有很多种,本文一一介绍,注释在代码里,直接上代码: 代码: <!DOCTYPE html> <html> ...

  9. 分布式-网络通信-IO-基础(2)

    IS 与 OS1. 基本 IO 操作1.1. InputStream 与 OutputStream1.1.1. 输入与输出我们编写的程序除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身 ...

  10. 套接字之close系统调用

    close系统调用用于关闭文件描述符,其系统调用实现如下所示: / * Careful here! We test whether the file pointer is NULL before * ...