C ++中的三个相等部分
假设我们有一个0和1的数组A,我们必须将数组分成3个非空部分,以使所有这些部分代表相同的二进制值。如果可能,请返回i + 1 <j的任何[i,j],这样-
A [0],A [1],...,A [i]是第一部分;
A [i + 1],A [i + 2],...,A [j-1]是第二部分,并且
A [j],A [j + 1],...,A [A.length-1]是第三部分。
所有这三个部分具有相等的二进制值。如果不可能,则返回[-1,-1]。
因此,如果输入类似于[0,1,0,1,1],则输出将为[0,4]
为了解决这个问题,我们将遵循以下步骤-
定义一个函数
getIdx()
,它将采用一个数组a,left,right,while(left <right和a [left]与0相同),执行-
(向左增加1)
而右<(int)a.size(),则执行-
如果a [left]不等于a [right],则返回-1
(向左增加1),(向右增加1)
向左返回-1
从主要方法中执行以下操作-
定义大小为2的数组ret,以-1填充
num:= 0,n:= A的大小
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
num:= num + 1((A [i]等于1),否则为0
如果num mod 3不等于0,则-
返回ret
如果num与0相同,则-
返回{0,2}
要求:= num / 3
idx:= n-1
对于初始化temp:= 0,当idx> = 0且temp <req时,更新(将idx减少1),执行
temp:= temp + 1,当(A [idx]等于1)时,否则为0
(将idx增加1)
firstEnd:= getIdx(A,0,idx)
如果firstEnd <0,则-
返回ret
secondEnd:= getIdx(A,firstEnd + 1,idx)
如果secondEnd <0,则-
返回ret
返回{firstEnd,secondEnd + 1}
让我们看下面的实现以更好地理解-
示例
#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> threeEqualParts(vector<int>& A){
vector<int> ret(2, -1);
int num = 0;
int n = A.size();
for (int i = 0; i < n; i++) {
num += (A[i] == 1);
}
if (num % 3 != 0)
return ret;
if (num == 0) {
return { 0, 2 };
}
int req = num / 3;
int idx = n - 1;
for (int temp = 0; idx >= 0 && temp < req; idx--) {
temp += A[idx] == 1;
}
idx++;
int firstEnd = getIdx(A, 0, idx);
if (firstEnd < 0)
return ret;
int secondEnd = getIdx(A, firstEnd + 1, idx);
if (secondEnd < 0)
return ret;
return { firstEnd, secondEnd + 1 };
}
int getIdx(vector<int>& a, int left, int right){
while (left < right && a[left] == 0)
left++;
while (right < (int)a.size()) {
if (a[left] != a[right])
return -1;
left++;
right++;
}
return left - 1;
}
};
main(){
Solution ob;
vector<int> v = {0,1,0,1,1};
print_vector(ob.threeEqualParts(v));
}
输入项
{0,1,0,1,1}
输出结果
[1, 4, ]
以上是 C ++中的三个相等部分 的全部内容, 来源链接: utcz.com/z/317018.html