【Leetcode -605.种花问题 -628.三个数的最大乘积】

简介: 【Leetcode -605.种花问题 -628.三个数的最大乘积】

Leetcode -605.种花问题

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

给你一个整数数组 flowerbed 表示花坛,由若干 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

提示:

1 <= flowerbed.length <= 2 * 10^4

flowerbed[i] 为 0 或 1

flowerbed 中不存在相邻的两朵花

0 <= n <= flowerbed.length

思路是判断当前位置的前后位置是否有种花,若是第一个位置,则默认前一个位置没种花;若是最后一个位置,则默认后一个位置没种花;其他位置正常判断;若符合题意的种花规则,则在这个位置种花,n 自减,最后判断 n 的取值是否合理;

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n)
    {
        //对数组进行遍历
        for (int i = 0; i < flowerbedSize; i++)
        {
            //分情况讨论:
            //(1)判断当前位置是否有种花,没有种花返回1
            //(2)如果当前位置没有种花,判断这个位置是否是第一个位置,若是,则默认它的前一个位置没有种花,返回1;
            // 若不是,判断它的前一个位置是否有种花,没有种花返回1
            //(3)如果当前位置没有种花,判断这个位置是否是最后一个位置,若是,则默认它的后一个位置没有种花,返回1;
            // 若不是,判断它的后一个位置是否有种花,没有种花返回1
            // 如果以上三种情况都为1,则在当前位置种花,n自减
            if (!flowerbed[i] &&
                (i == 0 || !flowerbed[i - 1]) &&
                (i + 1 == flowerbedSize || !flowerbed[i + 1]))
            {
                flowerbed[i] = 1;
                n--;
            }
        }
        //最后判断是否能种入 n 朵花,如果 n 还是大于 0 ,则说明不能种入 n 朵花;否则可以;
        return n <= 0;
    }

Leetcode -628.三个数的最大乘积

题目:给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:

输入:nums = [1, 2, 3]

输出:6

示例 2:

输入:nums = [1, 2, 3, 4]

输出:24

示例 3:

输入:nums = [-1, -2, -3]

输出: - 6

提示:

3 <= nums.length <= 10^4

-1000 <= nums[i] <= 1000

思路是先进行升序排序,因为数组中的元素有负数的存在,排序完负数在前,两个负数相乘等于正数,所以先判断前两个负数相乘,再乘上数组中的最大值,即最后一个元素,存到 max1 中;另外再将数组的最后三个数相乘,存到 max2 中,比较 max1 和 max2 的大小,返回较大值;

int cmp(const void* p1, const void* p2)
    {
        return *(int*)p1 - *(int*)p2;
    }
    int maximumProduct(int* nums, int numsSize)
    {
        //先进行升序排序
        qsort(nums, numsSize, sizeof(int), cmp);
        //因为数组中的元素有负数的存在,排序完负数在前,两个负数相乘等于正数
        //所以先判断前两个负数相乘,再乘上数组中的最大值,即最后一个元素,存到 max1 中
        //再将数组的最后三个数相乘,存到 max2 中,比较 max1 和 max2 的大小,返回较大值
        int max1 = nums[0] * nums[1] * nums[numsSize - 1];
        int max2 = nums[numsSize - 1] * nums[numsSize - 2] * nums[numsSize - 3];
        return fmax(max1, max2);
    }
目录
相关文章
|
6月前
|
Go
golang力扣leetcode 713.乘积小于K的子数组
golang力扣leetcode 713.乘积小于K的子数组
42 0
|
6月前
|
Go
golang力扣leetcode 238.除自身以外数组的乘积
golang力扣leetcode 238.除自身以外数组的乘积
39 0
|
6月前
|
Go
golang力扣leetcode 152.乘积最大子数组
golang力扣leetcode 152.乘积最大子数组
64 0
|
6月前
|
Go
golang力扣leetcode 479.最大回文数乘积
golang力扣leetcode 479.最大回文数乘积
40 0
|
6月前
|
算法 测试技术 vr&ar
☆打卡算法☆LeetCode 152. 乘积最大子数组 算法解析
☆打卡算法☆LeetCode 152. 乘积最大子数组 算法解析
|
3月前
|
算法 Java 索引
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
36 0
|
3月前
|
Python
【Leetcode刷题Python】318. 最大单词长度乘积
本文提供了LeetCode题目318的Python编程解决方案,题目要求在一个字符串数组中找出两个不含有公共字母的单词,且这两个单词的长度乘积最大,如果不存在这样的两个单词,则返回0。
17 0
|
6月前
DAY-4 | 力扣 - 求自身以外数组的乘积:区间划分,左右累乘,巧求乘积
该文档是关于LeetCode上的一道题目“Product of Array Except Self”的题解。提供了两种解题方法,一是暴力破解,即计算所有数的乘积后再逐个除以当前元素;二是左右累乘法,通过两次遍历数组分别计算左侧和右侧元素的乘积,避免了除法操作。其中,左右累乘法更优,代码实现中展示了这种方法。
43 1
|
5月前
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
|
6月前
【力扣】238. 除自身以外数组的乘积
【力扣】238. 除自身以外数组的乘积