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]第三大的数 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); }欢迎分享,转载请注明来源:内存溢出
评论列表(0条)