时间:2020-09-06
题目分类 :数组
题目一 :最大乘积
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 :
输入: [1,2,3]
输出: 6
输入: [1,2,3,4]
输出: 24
思路 :
操作主要分为两个步骤,先排序,再取最大乘积。排序采用冒泡排序,按照数值排序完成后再分析最大乘积。设最大乘积为max,max可分两种情况讨论
- max <= 0 这种情况的特点是给定数组的最大值小于等于0。排序完成后,查询有序数组的最后一项(最大值)是否为正数,最大元素不是正数,则满足max <= 0 。此时若最后一项为0,可取数组最后一项和任意两项相乘得到最大乘积。若最后一项不为0,则取绝对值最小,真值最大的三项相乘,即数组的最后三项,因此max <= 0 的情况下,直接取最后三项相乘即可。
- 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;
};