【LeetCode】数组-2(628)-数组中三个数相乘最大

题目不难:

思路一(排序取两端)

先排序,最后三个数相乘即可。(很快就想到了,但是没想全面 [??] )

缺陷:没有考虑到有负数的情况,当至少有两个负数时,需要判断 最大数乘两个最小的负数 和 三个最大数相乘的大小,返回大的。

代码如下:

public class Solution {
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        return Math.max(nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3], nums[0] * nums[1] * nums[nums.length - 1]);
    }
}

复杂度分析 主要是排序比较浪费

时间复杂度:O(n*logn)

空间复杂度:O(n*logn)

思路二(不排序,只遍历一次,只保存三个最大的,和两个最小的)

此题get新技能 最大数和最小数的表示法。Integer.MAX_VALUE Integer.MIN_VALUE

注意更新时不能只判断一个,其他的也要判断,要不就丢解了。下面程序说明。

(错误代码示范)

 1 public class Solution {
 2     public int maximumProduct(int[] nums) {
 3         if (nums == null || nums.length < 1) {
 4             return -1;
 5         }
 6         int min1 = Integer.MAX_VALUE;
 7         int min2 = Integer.MAX_VALUE;
 8         int max1 = Integer.MIN_VALUE;
 9         int max2 = Integer.MIN_VALUE;
10         int max3 = Integer.MIN_VALUE;
11
12         for (int i : nums) {
13             if (i < min1) {
14                 min2 = min1;
15                 min1 = i;
16             }
17             if (i > max1) {
18                 max3 = max2;
19                 max2 = max1;
20                 max1 = i;
21             }
22         }
23         return Math.max(max1 * max2 * max3, min1 * min2 * max3);
24     }
25 }

(正确的代码)还要注意不等号中的等号不能省略,因为可能有相等的情况。

 1 public class Solution {
 2     public int maximumProduct(int[] nums) {
 3         if (nums == null || nums.length < 1) {
 4             return -1;
 5         }
 6         int min1 = Integer.MAX_VALUE;
 7         int min2 = Integer.MAX_VALUE;
 8         int max1 = Integer.MIN_VALUE;
 9         int max2 = Integer.MIN_VALUE;
10         int max3 = Integer.MIN_VALUE;
11
12         for (int i : nums) {
13             if (i <= min1) {
14                 min2 = min1;
15                 min1 = i;
16             } else if (i >= min1 && i <= min2) {
17                 min2 = i; //别忘了更新 min2 哦,下面同理~
18             }
19             if (i >= max1) {
20                 max3 = max2;
21                 max2 = max1;
22                 max1 = i;
23             } else if (i <= max1 && i >= max2) {
24                 max3 = max2;
25                 max2 = i;
26             } else if (i <= max2 && i >= max3) {
27                 max3 = i;
28             }
29         }
30         return Math.max(max1 * max2 * max3, min1 * min2 * max1);
31     }
32 }

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

时间: 2024-10-13 16:35:06

【LeetCode】数组-2(628)-数组中三个数相乘最大的相关文章

【LEETCODE】52、数组分类,简单级别,题目:717,661,746,628,643,849

package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * @ClassName: IsOneBitCharacter * @Author: xiaof * @Description: TODO 717. 1-bit and 2-bit Characters * We have two special characters. The first charac

LeetCode 16 3Sum Closest 找出最接近指定target的三个数的和

题目: Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-

15 3Sum(寻找三个数之和为指定数的集合Medium)

题目意思:给一个乱序数组,在里面寻找三个数之和为0的所有情况,这些情况不能重复,增序排列 思路:前面2sum,我用的是map,自然那道题map比双指针效率高,这道题需要先排序,再给三个指针,i.j.k 对于i指针从前往后遍历,对于一个固定的i指针,其实就是2Sum的情况,给定一前一后两个指针进行遍历, 值大了,就把后面的指针往前移,值小了就把前面的指针往后移. 比较麻烦的地方在于去重,首先是i指针的去重,j和k只用一个去重就可以了 ps:这是数组中一种十分常用的方法. 1 class Solut

数组中唯一出现一次的一个,两个,三个数,其余数都是偶数次出现(java版本)

首先在leetcode上面有这样类似的题,做法大致类似 1,首先是只出现一次的一个数 比较简单,直接全部亦或值就得到了 //只出现一次的一个数 public static int singleNumber1(int[] A) { int res=0; for(int i=0;i<A.length;i++) res^=A[i]; return res; } 2,只出现一次的两个数 则所有的值亦或肯定不为0,设最后的抑或结果为M,找到M从低到高为最先为1的位置,然后根据所有数在该位置为0或者1,分为

数组中数目最多的三个数 2.3

是数组中超过一半数目问题的升级版,但万变不离其中 声明一个time数组和candidate数组,长度为3,分别存放三个数的次数和数字 首先次数声明为0,数字声明为不存在的数,这里暂时声明为-1,其实应该声明为一个不存在的数字 然后遍历数组 如果该数是第一个candidate,第一个candidate的time++ 如果是第二个,那么第二个time++; 然后也判断三个candidate的time是否达到0,如果达到,将更新candidate,更新为当前数字 最后返回candidate数组 pac

LeetCode第十六题-找出数组中三数之和最接近目标值的答案

3Sum Closest 问题简介: 给定n个整数的数组nums和整数目标,在nums中找到三个整数,使得总和最接近目标,返回三个整数的总和,可以假设每个输入都只有一个解决方案 举例: 给定数组:nums=[-1, 2, 1, -4], 目标值:target = 1. 最接近目标值的答案是2 (-1 + 2 + 1 = 2). 解法一: 与上一道题类似,这次要求的是三数之和与目标值的差值最小值,可以定义一个变量来记录这个差值 思路就是想先定义一个最接近的值默认取前三个数的合,然后将数组排序后 小

数组中出现一次的两个数(三个数)&amp; 求最后一位bit为1

对于两个数,对于结果中,剩余bit1来异或区分. 下面的解法,非常精简: int lastBitOf1(int number) { return number & ~(number - 1); } void getTwoUnique(vector<int>::iterator begin, vector<int>::iterator end, vector<int>& unique) { int xorResult = 0; for(vector<

LeetCode:三个数的最大乘积【628】

LeetCode:三个数的最大乘积[628] 题目描述 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例 1: 输入: [1,2,3] 输出: 6 示例 2: 输入: [1,2,3,4] 输出: 24 注意: 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]. 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围. 题目分析 仔细审题,我们发现,数组中元素的可以是负数,这也就说明,不一定是排序后的后三位数字是最大乘积. 那

LeetCode 628. 三个数的最大乘积

题目描述 LeetCode 628. 三个数的最大乘积 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例1 输入: [1,2,3] 输出: 6 示例2 输入: [1,2,3,4] 输出: 24 Java Code class Solution { public int maximumProduct(int[] nums) { int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.M