给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大 java实现

时间:2022-12-30 14:48:53

实现该算法主要思想是,

1.两个负数与与一个正数相乘

2.全为最大正数相乘得到最大值

下面用算法实现,时间复杂度为O(n),下面用java实现,不过有一些为0的情况排除下可以,还有一些整形过大可以变为long型,这边不做累赘。


 
   
  1. package com.meituan.test;
  2. public class Test {
  3. public static void main(String[] args) {
  4. int[] arr = { -10, -1, 0, 2, 34, 1, 10, 8, 9 };
  5. getMax(arr);
  6. }
  7. public static void getMax(int[] arr) {
  8. int max = 1, second_max = 1, third_max = 1;
  9. int min = 1, second_min = 1;
  10. for (int i = 0; i < arr.length; i++) {
  11. if (max < arr[i]) {
  12. third_max = second_max;
  13. second_max = max;
  14. max = arr[i];
  15. } else if (second_max < arr[i]) {
  16. third_max = second_max;
  17. second_max = arr[i];
  18. } else if (third_max < arr[i]) {
  19. third_max = arr[i];
  20. } else if (arr[i] < min) {
  21. second_min = min;
  22. min = arr[i];
  23. } else if (arr[i] < second_min) {
  24. second_min = arr[i];
  25. }
  26. }
  27. int max1=max*second_max*third_max;
  28. int max2=max*second_min*min;
  29. if(max1>=max2){
  30. System.out.println("max:"+max+" second_max:"+second_max+" third_max:"+third_max+" result:"+max1);
  31. }else{
  32. System.out.println("max:"+max+" second_min:"+second_min+" min:"+min+" result:"+max2);
  33. }
  34. }
  35. }

结果:

max:34   second_max:10 third_max:9     result:3060