最值算法
数组中两元素的最大乘积
https://leetcode-cn.com/problems/maximum-product-of-two-elements-in-an-array/
-
- 创建两个变量(max1,max2)用于记录两个最大值
-
- 循环枚举整个数组,如果比 max1 大,将 max1 赋值为当前元素,max2=max1,如果只比 max2 大则只赋值 max2
-
- 计算最大两个数-1 的乘积
js 版本
int maxProduct(int* nums, int numsSize){
int max1 = -Infinity,
max2 = -Infinity;
for (let item of nums) {
if (item > max1) {
max2 = max1;
max1 = item;
} else if (item > max2) {
max2 = item;
}
}
return (max1 - 1) * (max2 - 1);
}
c 版本
int maxProduct(int* nums, int numsSize){
int max1 = 0, max2 = 0;
for(int i = 0; i < numsSize;++i){
if(nums[i]>=max1){
max2 = max1;
max1 = nums[i];
}else if(nums[i]>max2){
max2 = nums[i];
}
}
return (max1-1) * (max2-1);
}
最大连续 1 的个数
https://leetcode-cn.com/problems/max-consecutive-ones/
-
- 创建两个变量 一个记录最大值 max,一个记录次数 count
-
- 枚举每一项如果为 1,count+1,如果为零比较 max 与 count 取最大赋值给 max,count 置为 0
这里有个细节就是如果循环结束最后一位很有可能也是 1,所以返回返回结果时要再比较一次
js 版本
var findMaxConsecutiveOnes = function (nums) {
let max = 0,
count = 0;
for (let item of nums) {
if (item) {
count++;
} else {
max = Math.max(max, count);
count = 0;
}
}
return Math.max(max, count);
};
c 版本
int findMaxConsecutiveOnes(int* nums, int numsSize){
int res = 0,i,max=0;
for(i = 0; i < numsSize; ++i){
if(nums[i]){
res++;
}else{
max = res>max?res:max;
res=0;
}
}
return res>max?res:max;
}
寻找旋转排序数组中的最小值
https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
-
- 创建一个变量存最小值
-
- 枚举比较更新最小值
var findMin = function (nums) {
let min = Infinity;
for (let i = 0; i < nums.length; ++i) {
if (nums[i] < min) {
min = nums[i];
}
}
return min;
};
c 版本
int findMin(int* nums, int numsSize){
int min = 5001;
for(int i = 0; i < numsSize;++i){
if(nums[i]<min){
min = nums[i];
}
}
return min;
}
第三大的数
https://leetcode-cn.com/problems/third-maximum-number/
首先我第一眼思路是通过三个变量取到最小值,但是这里有两个细节,第一个细节第三个最大值不存在反回最大值,第二个细节就是指的是不同的数字
-
- 创建三个变量记录 3 个最大值(max1,max2,max3)
-
- 枚举每一个数做比较,但是与已有最大值中某一个相等时则跳过本次循环
-
- 查看是否有第三个最大数,没有反最大数
js 版本
var thirdMax = function (nums) {
let max1 = (max2 = max3 = -Infinity);
for (let item of nums) {
if (item == max1 || item == max2 || item == max3) {
continue;
}
if (item > max1) {
[max3, max2, max1] = [max2, max1, item];
} else if (item > max2) {
[max3, max2] = [max2, item];
} else if (item > max3) {
max3 = item;
}
}
return max3 == -Infinity ? max1 : max3;
};
c 版本
const int RANDOMTAG = -5201314;
int ge(int a, int b){
if(b == RANDOMTAG) return 1;
return a>= b;
}
int thirdMax(int* nums, int numsSize){
int max1 = RANDOMTAG;
int max2 = RANDOMTAG;
int max3= RANDOMTAG;
for(int i = 0; i < numsSize; ++i){
int item = nums[i];
if (item == max1 || item == max2 || item == max3) {
continue;
}
if (ge(item, max1)) {
max3 = max2;
max2 = max1;
max1 = item;
} else if (ge(item, max2)) {
max3 = max2;
max2 = item;
} else if (ge(item, max3)) {
max3 = item;
}
}
return max3 == RANDOMTAG?max1:max3;
}
买卖股票的最佳时机
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
-
- 创建两个变量,一个记录最小值 min,一个记录最大差值 sum
-
- 枚举每一个值如果当前值比 min 小着重新赋值最小值,否则计算比较 sum 获得最大差值
js 版本
var maxProfit = function (prices) {
let sum = 0,
minNum = Infinity;
for (let i = 0; i < prices.length; ++i) {
if (prices[i] < minNum) {
minNum = prices[i];
} else if (prices[i] - minNum > sum) {
sum = prices[i] - minNum;
}
}
return sum;
};
c 版本
int maxProfit(int* prices, int pricesSize){
int sum = 0;
int min = 2147483647;
for(int i = 0;i < pricesSize;++i){
if(min>prices[i]){
min = prices[i];
}else if(prices[i]-min > sum){
sum = prices[i]-min;
}
}
return sum;
}
三个数的最大乘积
这道题要考虑两种计算方式 1.如果有负数则两个最小数乘一个最大数,如果没有负数就是三个最大值相乘
js 版本
- 将数组从下到大排序
- 比较两种计算方式哪个数大
var maximumProduct = function (nums) {
nums.sort((a, b) => a - b);
let n = nums.length;
return Math.max(
nums[0] * nums[1] * nums[n - 1],
nums[n - 1] * nums[n - 2] * nums[n - 3]
);
};
c版本
int cmp(const void *a, const void *b){
return *(int *)a - *(int *)b;
}
int max(int a,int b){
return a>b?a:b;
}
int maximumProduct(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp);
int num1 = nums[0]*nums[1]*nums[numsSize-1];
int num2 = nums[numsSize-1]*nums[numsSize-2]*nums[numsSize-3];
return max(num1,num2);
}