五月集训(第01天)——数组
数组
1. 增量元素之间的最大差值
题目:
思路:
考虑到数据范围,O(n^2)暴力枚举
int maximumDifference(int* nums, int numsSize){
if (numsSize <= 1) return -1;
int maxn = -1;
for (int i = 0; i < numsSize; i++) {
for (int j = i + 1; j < numsSize; j++) {
if (nums[i] < nums[j])
maxn = maxn > nums[j] - nums[i] ? maxn : nums[j] - nums[i];
}
}
return maxn;
}
2. 找到最接近 0 的数字
题目:
思路:
遍历数组,寻找最小的绝对值,维护正数和负数的符号位标记,最后判断整数符号位标记为1则返回正数结果,否则返回负数或 0 结果
int findClosestNumber(int* nums, int numsSize){
int flag_neg = 0, flag_pos = 0;
int ans = 1e5 + 10;
for (int i = 0; i < numsSize; i++) {
if (nums[i] == 0) {
ans = 0;
break;
}
if (ans >= abs(nums[i])) {
if (nums[i] < 0 && ans != (-nums[i])) ans = -nums[i], flag_neg = 1, flag_pos = 0;
else if (nums[i] > 0) ans = nums[i], flag_pos = 1;
}
}
return flag_pos ? ans : (-ans);
}
3. 商品折扣后的最终价格
题目:
思路:
枚举寻找答案即可
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* finalPrices(int* prices, int pricesSize, int* returnSize){
int *ret = (int *)malloc(sizeof(int) * pricesSize);
for (int i = 0; i < pricesSize; i++) {
ret[i] = prices[i];
for (int j = i + 1; j < pricesSize; j++) {
if (prices[i] >= prices[j]) {
ret[i] = ret[i] - prices[j];
break;
}
}
}
*returnSize = pricesSize;
return ret;
}
4. 多个数组求交集
题目:
思路:
利用哈希表对应一下,每个值映射到一个统计值,mmap[ nums[i][j] ] ++,最后mmap[nums[i][j]] == 行数,则nums[i][j]是所有每一行的交集
注意开返回数组的时候,大小要和哈希表一致,我就这个点WA穿了
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* intersection(int** nums, int numsSize, int* numsColSize, int* returnSize){
int* ret = (int *)malloc(sizeof(int) * 1010);
int mmap[1010] = {0};
for (int i = 0; i < numsSize; i++) {
for (int j = 0; j < numsColSize[i]; j++) {
mmap[nums[i][j]] ++;
}
}
int cnt = 0;
for (int i = 0; i < 1010; i++) if (mmap[i] == numsSize) ret[cnt++] = i;
*returnSize = cnt;
return ret;
}
东方欲晓,莫道君行早。