力扣刷题记录02

时间:2020-09-06
题目分类 :数组

题目一 :最大乘积

给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 :
输入: [1,2,3]
输出: 6
输入: [1,2,3,4]
输出: 24

思路 :

操作主要分为两个步骤,先排序,再取最大乘积。排序采用冒泡排序,按照数值排序完成后再分析最大乘积。设最大乘积为max,max可分两种情况讨论

  1. max <= 0 这种情况的特点是给定数组的最大值小于等于0。排序完成后,查询有序数组的最后一项(最大值)是否为正数,最大元素不是正数,则满足max <= 0 。此时若最后一项为0,可取数组最后一项和任意两项相乘得到最大乘积。若最后一项不为0,则取绝对值最小,真值最大的三项相乘,即数组的最后三项,因此max <= 0 的情况下,直接取最后三项相乘即可。
  2. max>0 若max > 0 ,可分两种情况进行讨论。一是max为三个正数相乘;二是max为一个正数和两个负数相乘。第一种情况,max取有序数组最后三项相乘即可,第二种情况,max取最大正数和两个最小负数相乘即可。

代码如下

var maximumProduct = function (nums) {

    let length = nums.length;

	//排序
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < nums.length-i;j++){
            if (nums[j] > nums[j+1]){
                let temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
            }
        }
    }
	
    let num0 = nums[length-3]*nums[length-2]*nums[length-1];
    let num1 = nums[0]*nums[1]*nums[length-1];

    if(nums[length-1] <= 0){
        return num0;
    }else{
       if(num0 > num1){
            return num0
       }else{
            return num1 
       }
    }
};

题目二 :连续奇数

给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false 。
示例 :
输入:arr = [2,6,4,1]
输出:false
解释:不存在连续三个元素都是奇数的情况。
输入:arr = [1,2,34,3,4,5,7,23,12]
输出:true
解释:存在连续三个元素都是奇数的情况,即 [5,7,23] 。

思路
利用指针在遍历过程中追踪奇数,每次遍历检测到相应的奇数后将指针移到该下标,再检测该奇数的前面两项是否同时是奇数。若两项同时是奇数,可直接结束遍历,若只有一项是奇数,则将指针右移到新的奇数的下标,废弃已经遍历过的奇数。

代码如下

var threeConsecutiveOdds = function (arr) {
    let count;
    for (let i = 0; i < arr.length; i++) {
        if (arr[i]%2 == 1){
            count = i;
            if(arr[count+1]%2 == 1){
                if(arr[count+2]%2 == 1){
                    return true
                }else{
                    count++;
                    i++;
                }
            }
        }
    }
    return false
};

题目三 :种花规则

假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。
示例 1:
输入: flowerbed = [1,0,0,0,1], n = 1
输出: True
示例 2:
输入: flowerbed = [1,0,0,0,1], n = 2
输出: False

思路
这道题比上面的连续奇数要繁琐一些,不能直接根据前面两项是否为0判断该位置是否适合种花。因此将指针标记位置改为花的预判位置后,检测数组的前一项和后一项是否为1,再判断该处能否种下花朵。此外还要对数组首尾进行特殊判断。

代码

var canPlaceFlowers = function (flowerbed, n) {
    if (n == 0) return true
    let count = 0;
    for (let i = 0; i < flowerbed.length; i++) {
        if (flowerbed[i] == 0) {
            if (i == 0) {
                if (flowerbed[i + 1] == 0 || flowerbed[i+1] == undefined) {
                    flowerbed[i] = 1;
                    count++;
                    if (count >= n) return true;
                }
            }
            if (i == flowerbed.length - 1) {
                if (flowerbed[i - 1] == 0) {
                    count++;
                    if (count >= n) return true
                }
            }
            if (flowerbed[i + 1] == 0 && flowerbed[i - 1] == 0) {
                flowerbed[i] = 1;
                count++;
                if (count >= n) return true
            }
        }
    }
    return false;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值