前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Leetcode -605.种花问题 -628.三个数的最大乘积】

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

作者头像
YoungMLet
发布2024-03-01 09:56:53
1130
发布2024-03-01 09:56:53
举报
文章被收录于专栏:C++/Linux

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 的取值是否合理;

代码语言:javascript
复制
		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 的大小,返回较大值;

代码语言:javascript
复制
		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);
		}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Leetcode -605.种花问题
  • Leetcode -628.三个数的最大乘积
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档