文章目录
今天练习数组的内容,太久没练习,已经有点生疏了,需要更加注重算法的提升,减少暴力解题
解题报告
1.2016. 增量元素之间的最大差值
给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。
返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。
int maximumDifference(int* nums, int numsSize){
int i,j,k = 0;
for (i = 0;i < numsSize - 1; i++){
for (j = i + 1; j < numsSize; j++){
k = nums[j] - nums[i] > k ? nums[j] - nums[i] : k;
}
}
return k > 0 ? k : -1;
}
由于数组的元素个数较少,可以使用暴力枚举法,两重循环遍历所有差值,需要注意两数相等时同样应该返回-1
#define MAX(a,b)((a) > (b) ? (a) : (b))
int maximumDifference(int* nums, int numsSize){
int j,ans = -1,min = nums[0];
for (j = 1;j < numsSize; j++){
if (nums[j] > min){
ans = MAX(ans,nums[j] - min);
} else{
min = nums[j] ;
}
}
return ans;
}
使用前缀最小记录min,只需要遍历一次数组
2.2239. 找到最接近 0 的数字
给你一个长度为
n
的整数数组nums
,请你返回nums
中最 接近0
的数字。如果有多个答案,请你返回它们中的 最大值 。
int findClosestNumber(int* nums, int numsSize){
int i, ans = nums[0] , de = abs(nums[0]);
for (i = 1; i < numsSize; i++){
if ( abs(nums[i]) == de ){
ans = nums[i] > ans ? nums[i] : ans;
} else if (abs(nums[i]) < de) {
ans = nums[i];
de = abs(nums[i]);
}
}
return ans;
}
使用两个变量储存数组最小绝对值对应最大数值
3.1475. 商品折扣后的最终价格
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* finalPrices(int* prices, int pricesSize, int* returnSize){
int *ans = (int *)malloc(pricesSize * sizeof(int));
*returnSize = pricesSize;
int min = prices[1], i,j;
for (i = 0 ; i < pricesSize ;++i){
ans[i] = prices[i];
}
for (i = 0 ;i <pricesSize - 1; ++i){
for (j = i + 1; j < pricesSize; ++j){
if (prices[i] >= prices[j] ){
ans[i] = prices[i] - prices[j];
break;
}
}
}
return ans;
}
数组存储需要正确申请,栈的解法还没学会,日后再补
4.2248. 多个数组求交集
给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中的每个元素在 nums 所有数组 中都出现过。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* intersection(int** nums, int numsSize, int* numsColSize, int* returnSize){
int hash[1001] = {0};
int *ret = (int *)malloc(1001*sizeof(int));
int i,j,size = 0;
for (i = 0; i < numsSize;i++){
for (j = 0; j < numsColSize[i];j++){
hash[nums[i][j]]++;
}
}
for(i = 0; i < 1001;i++){
if(hash[i] ==numsSize){
ret[size++] = i;
}
}
*returnSize = size;
return ret;
}
建立一个哈希表储存所有元素出现次数,只要出现次数等于数组数,就可以判断其是所有数组的交集,第二个循环自带升序排列,所以最后不需要再排列一次