日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在O(N)时间内求解 正数数组中 两个数相加的 最大值

發(fā)布時(shí)間:2025/4/9 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在O(N)时间内求解 正数数组中 两个数相加的 最大值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一,問題描述

給定一個(gè)正數(shù)數(shù)組arr(即數(shù)組元素全是正數(shù)),找出該數(shù)組中,兩個(gè)元素相加的最大值,其中被加數(shù)的下標(biāo)大于加數(shù)的下標(biāo)。由加法運(yùn)算的可逆性,j >i 這個(gè)條件可以去掉。

即求出: maxValue = max{arr[j]+arr[i] and j > i}?

在數(shù)組arr中沒有重復(fù)的元素情況下,若被加數(shù)的下標(biāo)可以等于加數(shù)的下標(biāo),則該問題變成了尋找正數(shù)數(shù)組arr中最大值的元素了。因?yàn)?max{arr[i]} + max{arr[i]} 一定比 max{arr[i]} + arr[j] 大,其中arr[j]為數(shù)組中的任意某個(gè)元素。

而《數(shù)據(jù)結(jié)構(gòu)與算法分析 Java語言描述》Mark Allen Weiss著 書中第37頁 2.28 題中并沒有指出數(shù)組arr中的元素不通重復(fù)。

?

二,求解思路

有兩種思路,一種是對(duì)數(shù)組中的每個(gè)元素,求出該元素與它后面元素的和,然后記錄下最大的。

如,對(duì)于下標(biāo)為 i 的元素,for each j belongs to [i+1, arr.length)需要求出 sum=arr[i]+arr[j] 其中,i belongs to [0,arr.length) and j >=i

這算法的時(shí)間復(fù)雜度為O(N^2)

第二種思路是,先將加數(shù)初始化為下標(biāo)為0的那個(gè)元素(arr[i]=arr[0]),然后,j 往后掃描,若遇到比arr[i]大的元素,則下標(biāo) i=j。也就是說,i 總是記錄比當(dāng)前arr[i]更大的元素(貪心思想

更詳細(xì)的解釋,類似于這篇文章

代碼如下:

1 //O(N). find out the max sum of two numbers in a positive array 2 public static int maxSum(int[] arr){ 3 int i = 0; 4 int max = 0;//數(shù)組中所有的元素都是正數(shù) 5 int addValue; 6 for(int j = 1; j < arr.length; j++){ 7 addValue = arr[i] + arr[j]; 8 if(addValue > max) 9 max = addValue; 10 if(arr[j] - arr[i] > 0) 11 i = j;//記錄更大的arr[i] 12 } 13 return max; 14 }

?

三,運(yùn)行時(shí)間的比較

采用 這篇文章 中提到的隨機(jī)數(shù)生成算法 來隨機(jī)生成一個(gè)數(shù)組,然后比較上面兩個(gè)算法的運(yùn)行時(shí)間。

機(jī)器環(huán)境如下:

OS:win7 64bit、RAM:6GB、CPU:Pentium(R)Dual-Core E5800@3.2GHz

時(shí)間比較如下:

數(shù)組大小??????? maxSum運(yùn)行時(shí)間(O(N)) ????? maxSum2算法2運(yùn)行時(shí)間(O(N^2))

100*100???????????? 1??????????????????????????????????????? 27

200*100???????????? 1??????????????????????????????????????? 68

300*100???????????? 2??????????????????????????????????????? 133

500*100???????????? 3??????????????????????????????????????? 359

?

此外,按照同樣的思路,也可以求解兩個(gè)數(shù)相加的最小值了,哈哈。。。。

求兩數(shù)相加的最小值,也同樣是每次貪心,貪一個(gè)較arr[i]更小的值即可,這簡(jiǎn)直和求解兩數(shù)相減的最大值一模一樣!!!

代碼如下:

1 public static int minSum(int[] arr){ 2 int min = Integer.MAX_VALUE; 3 int i = 0; 4 int addValue; 5 for(int j = 1; j < arr.length; j++){ 6 addValue = arr[j] + arr[i]; 7 if(addValue < min) 8 min = addValue; 9 if(arr[j] - arr[i] < 0) 10 i = j; 11 } 12 return min; 13 }

?

再擴(kuò)展一下:還可以計(jì)算三個(gè)數(shù)相加的最大值。還是同樣的思路,當(dāng)碰到比上一次運(yùn)算中的 加數(shù) 更大的數(shù)時(shí),則把該數(shù)替換掉原來加數(shù)中最小的那個(gè)加數(shù)。(三數(shù)相加,視為有三個(gè)加數(shù)。。。^-^)

再擴(kuò)展一下,是不是感覺到這個(gè)問題和 求解最大子序列和 有點(diǎn)聯(lián)系了?? 二者都是直接跳過某些不需要“關(guān)注”的元素,并總是“貪心”出 下一個(gè)候選元素。

?

完整代碼如下:

1 public class MaxSum { 2 3 //O(N). find out the max sum of two numbers in a positive array 4 public static int maxSum(int[] arr){ 5 int i = 0; 6 int max = 0;//數(shù)組中所有的元素都是正數(shù) 7 int addValue; 8 for(int j = 1; j < arr.length; j++){ 9 addValue = arr[i] + arr[j]; 10 if(addValue > max) 11 max = addValue; 12 if(arr[j] - arr[i] > 0) 13 i = j;//記錄更大的arr[i] 14 } 15 return max; 16 } 17 18 19 public static int maxSum2(int[] arr){ 20 int max = 0; 21 int addValue; 22 for(int i = 0; i < arr.length; i++){ 23 for(int j = i+1; j < arr.length; j++){ 24 addValue = arr[j] + arr[i]; 25 if(addValue > max) 26 max = addValue; 27 } 28 } 29 return max; 30 } 31 32 public static void main(String[] args) { 33 int[] arr = C2_2_8.algorithm3(100*100*10); 34 35 long start = System.currentTimeMillis(); 36 int r = maxSum(arr); 37 long end = System.currentTimeMillis(); 38 System.out.println("maxValue=" + r + " O(N)'s time:" + (end -start)); 39 40 long start2 = System.currentTimeMillis(); 41 int r2 = maxSum2(arr); 42 long end2 = System.currentTimeMillis(); 43 System.out.println("maxValue=" + r2 + " O(N^2)'s time:" + (end2 - start2)); 44 } 45 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/hapjin/p/5403384.html

總結(jié)

以上是生活随笔為你收集整理的在O(N)时间内求解 正数数组中 两个数相加的 最大值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。