前言
我的五月刷题日记,刚开始先找些简单题做一下吧,不然没了兴趣,后面争取每天发一篇解题报告,一起加油!
第一天:数组
一、练习题目
题目链接 | 难度 |
---|---|
2016. 增量元素之间的最大差值 | ★☆☆☆☆ |
2239. 找到最接近 0 的数字 | ★☆☆☆☆ |
1475. 商品折扣后的最终价格 | ★☆☆☆☆ |
2248. 多个数组求交集 | ★☆☆☆☆ |
二、思路与代码
1. 增量元素之间的最大差值
解法1:暴力搜索,时间复杂度O(n^2)
int maximumDifference(int* nums, int numsSize){
int i, j;
int ans = 0;
for (i = 0; i < numsSize; ++i){
for (j = i; j < numsSize; ++j){
if (nums[j] - nums[i] > ans){
ans = nums[j] - nums[i];
}
}
}
return mmax > 0 ? mmax : -1;
}
解法2:由题可知,i < j && nums[i] < nums[j],设定nums[0]为最小值mmin,遍历,若nums[i]小于mmin,交换两者位置;若nums[i]大于mmin,作差后判别最大值。优化后的时间复杂度O(n)
int maximumDifference(int* nums, int numsSize){
int i, j;
int mmin = nums[0];
int ans = -1;
for (i = 0; i < numsSize; ++i){
if (nums[i] > mmin){
ans = nums[i] - mmin > ans ? nums[i] - mmin : ans; //求nums[i]-mmin与ans之间的最大值
}else{
mmin = nums[i];
}
}
return ans;
}
2.找到最接近 0 的数字
解法1:需要同时记录最小距离,以及最小距离下的数组值,时间复杂度O(n)
int findClosestNumber(int* nums, int numsSize){
int i;
int mmin = 100001;
int ans;
for(i = 0; i < numsSize; ++i){
int temp = nums[i] > 0 ? nums[i] : -nums[i];
if (mmin > temp){
mmin = temp;
ans = nums[i];
}else if (mmin == temp && nums[i] > 0){
ans = nums[i];
}
}
return ans;
}
解法2:python一行代码解决,但更耗时
class Solution(object):
def findClosestNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort(key = lambda x : (abs(x), -x))
return nums[0]
3.商品折扣后的最终价格
题目数据量不大,两次遍历即可,时间复杂度O(n^2)
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* finalPrices(int* prices, int pricesSize, int* returnSize){
int i, j;
for (i = 0; i < pricesSize - 1; ++i){
for (j = i + 1; j < pricesSize; ++j){
if (prices[j] <= prices[i]){
prices[i] -= prices[j];
break;
}
}
}
*returnSize = pricesSize;
return prices;
}
4.多个数组求交集
偷个懒,用python写一下吧
class Solution(object):
def intersection(self, nums):
"""
:type nums: List[List[int]]
:rtype: List[int]
"""
ans = set(nums[0])
for num in nums:
ans = ans & set(num)
ans = list(ans)
ans.sort()
return ans