线性枚举(跟着英雄学算法)

最值算法

数组中两元素的最大乘积

https://leetcode-cn.com/problems/maximum-product-of-two-elements-in-an-array/

    1. 创建两个变量(max1,max2)用于记录两个最大值
    1. 循环枚举整个数组,如果比 max1 大,将 max1 赋值为当前元素,max2=max1,如果只比 max2 大则只赋值 max2
    1. 计算最大两个数-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/

    1. 创建两个变量 一个记录最大值 max,一个记录次数 count
    1. 枚举每一项如果为 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/

    1. 创建一个变量存最小值
    1. 枚举比较更新最小值
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/
首先我第一眼思路是通过三个变量取到最小值,但是这里有两个细节,第一个细节第三个最大值不存在反回最大值,第二个细节就是指的是不同的数字

    1. 创建三个变量记录 3 个最大值(max1,max2,max3)
    1. 枚举每一个数做比较,但是与已有最大值中某一个相等时则跳过本次循环
    1. 查看是否有第三个最大数,没有反最大数

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/

    1. 创建两个变量,一个记录最小值 min,一个记录最大差值 sum
    1. 枚举每一个值如果当前值比 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);
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值