题目:
??给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。 ??返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。
示例 1: 输入:nums = [7,1,5,4] 输出:4 解释: 最大差值出现在 i = 1 且 j = 2 时,nums[j] - nums[i] = 5 - 1 = 4 。 注意,尽管 i = 1 且 j = 0 时 ,nums[j] - nums[i] = 7 - 1 = 6 > 4 ,但 i > j 不满足题面要求,所以 6 不是有效的答案。
示例 2: 输入:nums = [9,4,3,2] 输出:-1 解释: 不存在同时满足 i < j 和 nums[i] < nums[j] 这两个条件的 i, j 组合。
示例 3: 输入:nums = [1,5,2,10] 输出:9 解释: 最大差值出现在 i = 0 且 j = 3 时,nums[j] - nums[i] = 10 - 1 = 9 。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-difference-between-increasing-elements
思路:
??1.维护遍历过的元素的最小值,当遍历到比最小值大的数时,与之前的差值进行比较,选出最大的差值。 2.我的思路:在数组中划一条分割线,找出线右边的最大值-线左边的最小值的最大差值。
核心代码:
1.标准解法:
int max(int a,int b);
int maximumDifference(int* nums, int numsSize){
if(nums == NULL || numsSize <1)
return -1;
int min = nums[0];
int ret = -1;
for(int i=1;i<numsSize;i++)
{
if(nums[i] > min)
ret = max(ret,(nums[i] - min));
else
min = nums[i];
}
return ret;
}
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
2.我的:
int minaInArray(int* nums,int size);
int maximumDifference(int* nums, int numsSize){
if(nums == NULL || numsSize <1)
return -1;
int max=nums[numsSize-1];
int min=nums[0];
int differ;
min = minaInArray(nums,numsSize-1);
differ = max-min;
for(int i=1;i<numsSize-1;i++)
{
if(nums[numsSize-1-i]<= max)
min = minaInArray(nums,numsSize-1-i);
else
{
max = nums[numsSize-1-i];
min = minaInArray(nums,numsSize-1-i);
}
if(differ < max-min)
differ= max-min;
}
if(differ>0)
return differ;
else
return -1;
}
int minaInArray(int* nums,int size)
{
int min=nums[0];
for(int i=0; i<size; i++)
{
if(min>nums[i])
min = nums[i];
}
return min;
}
|