著者: Xiao Xun
リンク: https://leetcode.cn/problems/greatest-sum-divisible-by-three/solutions/2314049/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun- r0n76/
出典: LeetCode の著作権は
作者に帰属します。商業的転載の場合は著者に連絡して承認を求め、非商業的転載の場合は出典を明記してください。
トピック
一連の考え
タイトル -> 整数配列 nums を指定して、3 で割り切れる要素の最大合計を見つけて返します。
配列には負の数がないため、配列全体の要素の合計 s が 3 で割り切れる場合、s は最大の要素の合計になります。
それ以外の場合、s が 3 で割り切れない場合は、s が 3 で割り切れるように s から nums[i] を減算できるかどうかを確認してください。
nums[i] mod 3=1 のすべての nums[i] を見つけて配列 a1 に入れ、nums[i] mod 3=2 のすべての nums[i] を見つけて配列 a2 に入れます。a1 と a2 を小さいものから大きいものへと並べます。カテゴリディスカッション:
- s mod 3=1 の場合:
- a1 が空でない場合、答えは s−a1[0] になる可能性があります。
- a2 に少なくとも 2 つの数値がある場合、答えは s−a2[0]−a2[1] になる可能性があります。
- どちらの場合も最大値が採用されます。
- そのような数値が存在しない場合は 0 を返します。
- s mod 3=2 の場合:
- a2 が空でない場合、答えは s−a2[0] になる可能性があります。
- a1 に少なくとも 2 つの数値がある場合、答えは s−a1[0]−a1[1] となる可能性があります。
- どちらの場合も最大値が採用されます。
- そのような数値が存在しない場合は 0 を返します。
コードが実装されるとき、s mod 3=2 の場合、配列 a1 と a2 を交換して同じロジック セットを再利用できます。
コードコメントは非常に詳細です
コード
static int cmp(const void *a, const void *b) {//升序
return *(int *)a - *(int *)b;
}
int maxSumDivThree(int* nums, int numsSize) {
int a[3][numsSize];
memset(a, 0, sizeof(a));
int i = 0, j = 0, sum = 0;//初始化
for (int m = 0; m < numsSize; ++m) {//枚举所有元素
sum += nums[m];//统计元素和
if (nums[m] % 3 == 1) {//保存当前元素的余数
a[nums[m] % 3][i++] = nums[m];
} else if (nums[m] % 3 == 2) {
a[nums[m] % 3][j++] = nums[m];
}
}
if (sum % 3 == 0) return sum;//正好完成整除
qsort(a[1], i, sizeof(a[1][0]), cmp);
qsort(a[2], j, sizeof(a[2][0]), cmp);//升序
int *a1 = a[1], *a2 = a[2];//指针交换位置非常方便
if (sum % 3 == 2) {//情况二,交换指针
a1 = a[2];
a2 = a[1];
int temp = i;
i = j;
j = temp;
}
int ans = i == 0 ? 0 : sum - a1[0];//情况一判断
if (j > 1) ans = fmax(ans, sum - a2[0] - a2[1]);//情况二判断
return ans;
}
作者:小迅
链接:https://leetcode.cn/problems/greatest-sum-divisible-by-three/solutions/2314049/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-r0n76/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。