两道题都是所有test cases都过了,直接贴代码了
/*
* #1 Flip bit
*/
int bitFlip(int arr_size, int* arr) {
int no_flip = 0;
int flip = 0, flip_min = 0;
int i = 0;
int *transform = NULL;
// Validting input
if ((arr_size == 0) || (arr == NULL)) return 0;
transform = (int*)malloc(sizeof(int) * arr_size);
for (i = 0; i < arr_size; i++) {
no_flip += arr[i];
if (arr[i] == 0) {
transform[i] = 1;
} else {
transform[i] = -1;
}
}
for (i = 0; i < arr_size; i++) {
if (flip + transform[i] >= 0) {
flip += transform[i];
} else {
flip = 0;
}
if (flip_min < flip) {
flip_min = flip;
}
}
free(transform);
return (no_flip + flip_min);
}
/*
* #2 Uneaten leaves
*/
// Calculate greatest common divisor
static long gcd(long a, long b) {
while (b != 0) {
long t = b;
b = a % b;
a = t;
}
return a;
}
// Calculating least common multiplier
static long lcm(long a, long b) {
return a * b / gcd(a, b);
}
int countUneatenLeaves(int N, vector < int > A) {
int eaten = 0;
vector<vector<int>> allSets;
vector<int> sol;
allSets.push_back(sol);
for(int i=0; i<A.size(); i++) {
int n = allSets.size();
for(int j=0; j<n; j++) {
// Finding a subset
sol = allSets[j];
sol.push_back(A[i]);
// Calculating the least common multiplier
int lcm_cur = sol[0];
int n = sol.size();
for (int i = 1; i < n; i++) {
lcm_cur = lcm(lcm_cur, sol[i]);
}
// Calculating the eaten leaves by this subset
int cur_eaten = N / lcm_cur;
// Modifying total eaten leaves
eaten += n % 2 == 1 ? cur_eaten : -cur_eaten;
allSets.push_back(sol);
}
}
return (N-eaten);
}