用C ++移动石头直到连续II
假设我们正在考虑一个无限数线,则第i个石头的位置由数组石头给出,而结石[i]表示第i个石头的位置。如果石头的位置最小或最大,则它是终点石头。现在,在每个回合中,我们拾起终点石并将其移至空位,以使其不再是终点石。
如果结石在说,结石=[1,2,5],则我们无法将终点结石移动到位置5,因为将其移动到任何位置(例如0或3)仍将其作为终点结石。
当我们无法再移动时,该游戏将停止。因此,宝石处于连续位置。
在这里我们必须找到游戏何时结束,那么我们本可以进行的最小和最大移动次数是多少?成对找到答案[min_moves,max_moves]
例如,如果输入类似于[7,3,9],则结果将为[1,3]
为了解决这个问题,我们将遵循以下步骤-
定义大小为2的数组
ans[0]:=inf,ans[1]:=-inf和n:=a的大小
对数组进行排序
x:=1
而x<n且a[x]&a[x−1]与1相同,则-
x增加1
如果x与n相同,则
返回一对{0,0}
minVal:=0,j:=1
用于初始化i:=0,当i<a.size(时,将i增加1做-
spaceInBetween:=true
如果a[j]-a[j-1])>1,则,
如果a[j]-a[j-1])>1,则,
将j增加1
spaceInBetween:=true
j:=i+1
curr:=a[i],lastPossible=a[i]
如果lastPossible>a[n-1],则从循环中出来
spaceInBetween:=假
如果j<=i,那么,
当j<n和a[j]<=lastPossible时,执行以下操作:
idx:=j-1
如果n-(idx-i+1)>1,则,
ballLeft:=i,ballRight:=n-(idx+1)
minVal:=ballLeft+ballRight+(当spaceInBetween为true时为0,否则为1)
ans[0]:=minValansans[0]的最小值
ans[1]:=a[n-2]-a[0]和a[n-1]-a[1])-(n-2)的最大值,
返回ans
从主要方法调用solve(石头)
示例
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> solve(vector<int> a) {
vector <int> ans(2);
ans[0] = INT_MAX;
ans[1] = INT_MIN;
int n = a.size();
sort(a.begin(), a.end());
int x = 1;
while(x < n && a[x] - a[x - 1] == 1)
x ++;
if(x == n){
return {0,0};
}
int minVal = 0;
int j = 1;
for(int i = 0; i < a.size(); i++){
int curr = a[i];
int lastPossible = a[i] + n - 1;
if(lastPossible > a[n - 1])
break;
bool spaceInBetween = false;
if(j <= i)
j = i + 1;
while(j < n && a[j] <= lastPossible){
if((a[j] - a[j - 1]) > 1) {
spaceInBetween = true;
}
j++;
}
int idx = j - 1;
if(n - (idx - i + 1) > 1)
spaceInBetween = true;
int ballLeft = i;
int ballRight = n - (idx + 1);
minVal = ballLeft + ballRight + (spaceInBetween? 0 : 1);
ans[0] = min(minVal, ans[0]);
}
ans[1] = max(a[n - 2] - a[0], a[n - 1] - a[1]) - (n -2);
return ans;
}
vector<int> numMovesStonesII(vector<int>& stones) {
return solve(stones);
}
};
main(){
Solution ob;
vector<int> v1 = {7,3,9};
print_vector(ob.numMovesStonesII(v1));
}输入值
[7,3,9]
输出结果
[1, 3, ]