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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

结对开发——环形一维数组求最大子数组和

發(fā)布時(shí)間:2024/4/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结对开发——环形一维数组求最大子数组和 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:返回一個(gè)整數(shù)數(shù)組中最大子數(shù)組的和。
要求:
(1)輸入一個(gè)整形數(shù)組,數(shù)組里有正數(shù)也有負(fù)數(shù)。
(2)數(shù)組中連續(xù)的一個(gè)或多個(gè)整數(shù)組成一個(gè)子數(shù)組,每個(gè)子數(shù)組都有一個(gè)和。
(3)如果數(shù)組A[0]……A[j-1]首尾相鄰,允許A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
(4)同時(shí)返回最大子數(shù)組的位置。
(5)求所有子數(shù)組的和的最大值。要求時(shí)間復(fù)雜度為O(n)。
一、設(shè)計(jì)思想
這個(gè)問(wèn)題的最優(yōu)解一定是以下兩種可能。
可能一:最優(yōu)解沒(méi)有跨過(guò)array[n-1]到array[0],即和非環(huán)形數(shù)組一樣了。
可能二:最優(yōu)解跨過(guò)array[n-1]到array[0],新問(wèn)題。
對(duì)于第一種情況,我們可以按照非環(huán)形數(shù)組求法來(lái)求,為max1;對(duì)于第二種情況,可以將原問(wèn)題轉(zhuǎn)化為數(shù)組的最小子數(shù)組和問(wèn)題,再用數(shù)組全部元素的和減去最小子數(shù)組和,那么結(jié)果一定是跨過(guò)a[n-1]到a[0]情況中最大的子數(shù)組和,設(shè)為max2。最終結(jié)果即為max1與max2中較大的那個(gè)。
例1:有數(shù)組5、-1、-6、8、2
求得max1=10,max2=15,則取較大的max2作為結(jié)果。
例2:有數(shù)組-6、8、1、6、-1
求得max1=15,max2=14,則取較大的max1作為結(jié)果。

二、程序代碼

package com.minirisoft; import java.util.*; public class MaxArray {public static void main(String[] args){int o1=0;int num,i;int sum=0;int max;int first=0;int last=0;int order=0;Scanner cin=new Scanner(System.in);System.out.print("請(qǐng)輸入數(shù)組的長(zhǎng)度:");num=cin.nextInt();int array[]=new int[num];int max1=array[0];int min=array[0];for(i=0;i<num;i++){array[i]=cin.nextInt();}for(i=0;i<num;i++){if(sum<=0){sum=array[i];first=i;}else{sum=sum+array[i];}if(sum>max1){max1=sum;last=i;}}System.out.println("第一種情況的最大值:"+max1);for(i=0;i<num;i++){if(sum>=0){sum=array[i];o1=i;}else{sum=sum+array[i];}if(sum<min){min=sum;order=i;}}int sum1=0;for(i=0;i<num;i++){sum1=sum1+array[i];}int max2=sum1-min;System.out.println("第二種情況的最大值:"+max2);if(max1>max2){System.out.println("和最大子數(shù)組為:");max=max1;for(int j=first;j<=last;j++){System.out.println(array[j]+"\t");}}else{max=max2;System.out.println("和最大子數(shù)組為:");for(int j=0;j<num;j++){ if(j<o1||j>order){System.out.println(array[j]+"\t");}/*if(j!=order){System.out.print(array[j]+"\t");}*/}}System.out.println("子數(shù)組和的最大值為:"+max);}}

?

三、程序截圖

?

四、心得體會(huì)

????? 關(guān)于設(shè)計(jì)思路,我們?cè)谡n上自己討論的想法和同學(xué)們想的也都差不多,就是單純求最大子數(shù)組的和,后來(lái)我們?cè)趯懗绦蜻^(guò)程中,時(shí)間復(fù)雜度不符合要求,新增了一種思路,即再求“sum - 最小子數(shù)組和”,求兩種情況的最大字?jǐn)?shù)組的和便和之前那種非環(huán)形的數(shù)組求和思路一樣,實(shí)現(xiàn)起來(lái)比重構(gòu)數(shù)組神馬的簡(jiǎn)單些,另外進(jìn)行定位時(shí)沒(méi)有想象的那么簡(jiǎn)單,尤其是在第二種情況顯示和最大數(shù)組時(shí),出現(xiàn)了條件錯(cuò)誤。

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

總結(jié)

以上是生活随笔為你收集整理的结对开发——环形一维数组求最大子数组和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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