1033. Moving Stones Until Consecutive

2023-12-21 16:32
文章标签 consecutive moving 1033 stones

本文主要是介绍1033. Moving Stones Until Consecutive,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1033. 移动石子直到连续

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

每一回合,我们假设这三枚石子当前分别位于位置 x, y, zx < y < z。从位置 x 或者是位置 z 拿起一枚石子,并将该石子移动到某一整数位置 k 处,其中 x < k < zk != y

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

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

 

示例 1:

输入:a = 1, b = 2, c = 5
输出:[1, 2]
解释:将石子从 5 移动到 4 再移动到 3,或者我们可以直接将石子移动到 3。

示例 2:

输入:a = 4, b = 3, c = 2
输出:[0, 0]
解释:我们无法进行任何移动。

 

提示:

  1. 1 <= a <= 100
  2. 1 <= b <= 100
  3. 1 <= c <= 100
  4. a != b, b != c, c != a

解法一

//时间复杂度O(1), 空间复杂度O(1)
class Solution {
public:vector<int> numMovesStones(int a, int b, int c) {int minI = min(a, min(b, c));int maxI = max(a, max(b, c));int midI = a + b + c - minI - maxI;int mininum_moves, maximum_moves;if(minI + 1 == midI && midI + 1 == maxI) mininum_moves = 0;else if(minI + 1 == midI || midI + 1 == maxI ||minI + 2 == midI || midI + 2 == maxI) mininum_moves = 1;else mininum_moves = 2;return {mininum_moves, maxI - minI - 2};}
};

逻辑优化

class Solution {
public:vector<int> numMovesStones(int a, int b, int c) {int minI = min(a, min(b, c));int maxI = max(a, max(b, c));int midI = a + b + c - minI - maxI;//abc排序if(minI + 1 == midI && midI + 1 == maxI) return {0, maxI - minI - 2};if(maxI - midI <= 2 || midI - minI <= 2) return {1, maxI - minI - 2};return {2, maxI - minI - 2};  }
};

思路:

分几种情况:

  1. 三个元素两两相邻,此时最小移动次数和最大移动次数为{0, 0};
  2. 三个元素中只有两个相邻,此时最大和最小移动次数为{1, maxI - minI - 2};
  3. 三个元素互不相邻,但中间元素与另一元素之间坐标差为2,此时第三个元素可以移动1次直接填补其中的空位,最大和最小移动次数为{1, maxI - minI - 2};
  4. 三个元素都互不相邻,最大和最小移动次数为{2, maxI - minI - 2};
  5. 综合以上2、3的情况,可总结如下:
两两相邻 -> {0, 0}
中间元素与另一元素之间坐标差小于等于2 -> {1, maxI - minI - 2}
其余情况 -> {2, maxI - minI - 2}
2019/09/10 22:29

这篇关于1033. Moving Stones Until Consecutive的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/520710

相关文章

[Gym103960B] Fun with Stones

并不是多困难或者有趣的题,写sol仅仅是因为觉得好笑()。 题目大意 三堆石子 Nim 游戏,第 i i i 堆石子数量在 [ l i , r i ] [l_i , r_i] [li​,ri​] 中随机,求先手必胜的概率,对 1 0 9 + 7 10^9+7 109+7 取模。 l i , r i ≤ 1 0 9 l_i , r_i≤10^9 li​,ri​≤109。 题解 说人

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

HumanNeRF:Free-viewpoint Rendering of Moving People from Monocular Video 翻译

HumanNeRF:单目视频中运动人物的自由视点绘制 引言。我们介绍了一种自由视点渲染方法- HumanNeRF -它适用于一个给定的单眼视频ofa人类执行复杂的身体运动,例如,从YouTube的视频。我们的方法可以在任何帧暂停视频,并从任意新的摄像机视点或甚至针对该特定帧和身体姿势的完整360度摄像机路径渲染主体。这项任务特别具有挑战性,因为它需要合成身体的照片级真实感细节,如从输入视频中可能

[LeetCode] 485. Max Consecutive Ones

题: 题目 Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1,1,0,1,1,1]Output: 3Explanation: The first two digits or the last three digits are consec

[LeetCode] 128. Longest Consecutive Sequence

题:https://leetcode.com/problems/longest-consecutive-sequence/description/ 题目 Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Your algorithm should

Replace All ?‘s to Avoid Consecutive Repeating Characters

Given a string s containing only lower case English letters and the '?' character, convert all the '?' characters into lower case letters such that the final string does not contain any consecutive re

HDU 1896 Stones (Priority_queue)

【题目链接】:click here~~ 【题目大意】: 就是说在一条直线道路上有n个石头,往前走,遇到一个数一个,如果遇到的是第奇数个那就把这个石头往前扔距离dis[i], 如果是第偶数个,就放置不管。 问人走到最后一个石头的位置距原地多远(遇到的最后一个石头距离出发点的位置是多少)。 【思路】模拟即可,遇到第奇数个石头,就将其加上dis[i],放回到优先队列(priority_queue)

485. Max Consecutive Ones 最大连续1的个数

https://leetcode-cn.com/problems/max-consecutive-ones/description/ 思路:用一个累加器count对所有元素求和,一旦遇到0就清零.用res记录下count的最大值,即可知道序列中最长的连续1有多少. int findMaxConsecutiveOnes(vector<int>& nums) {int count = 0;int

346. Moving Average from Data Stream

https://leetcode.com/problems/moving-average-from-data-stream/description/ 题目大意:初始化一个滑动窗口,大小为w,输入一系列数,求窗口内的平均数,窗口会向前滑动,当窗口填满时,将最早进入的数弹出,加入新的数. 解题思路:用队列,求和时可以利用上次的和,不用每次从头到尾求 代码: class MovingAverag

PAT 甲级 1096 Consecutive Factors

PAT 甲级 1096 Consecutive Factors #include <bits/stdc++.h>using namespace std;int main(){#ifdef LOCALfreopen("input.txt", "r", stdin);#endifint num, max_len = -1, now_len = 0, beg = 0, now_beg;cin