628.三个数的最大乘积
一开始用无脑三层for循化,超时了。后先用快排排序,再分类讨论。
如果全为非负或非正,直接取前三大的数。
如果有负有正,令max为正数。
即三正或一正两负。三正取前三大;两负一正取第一大和最后两个最小负数。
645.错误的集合
注:题干给的形参,每一个都有自己的意义,而且都要用上,不要搞混,即使答案应该正确也是错的。数组类题目如果错了“输出”会显示“]”,即输出不了。
题目本身要分类讨论,当第一个或最后一个数错了要另看。
697.数组的度
这道题有点思维,以下解法需要用到哈希表和二维数组。
#define MAX_N 50100
int findShortestSubArray(int* nums, int numsSize){
int cnt[MAX_N] = {0};
哈希数组存储各元素个数
int range[MAX_N][2];
第一行存储元素的第一次出现的下标,第二行存储最后一次出现的下标+1。
memset(range, -1, sizeof(range));
初始化二维数组
for (int i = 0; i < numsSize; ++i) {
cnt[nums[i]]++;
if (range[nums[i]][0] == -1) {
if使其第一次出现时(range[][0]为-1)的下标
range[nums[i]][0] = i;
}
遍历时,当数字出现时,更新range[][1]的值
range[nums[i]][1] = i + 1;
}
int mx = 0;
表示数组的度
int ans = numsSize;
for (int i = 0; i < numsSize; ++i) {
if (cnt[nums[i]] >= mx) {
int len = range[nums[i]][1] - range[nums[i]][0];
if (cnt[nums[i]] > mx) {
把度更大的值赋给mx
mx = cnt[nums[i]];
ans = len;
} else {
当度相等时,把子数组长度更小的赋给ans
ans = fmin(ans, len);
}
}
}
return ans;
}