<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    走在架構(gòu)師的大道上 Jack.Wang's home

    Java, C++, linux c, C#.net 技術(shù),軟件架構(gòu),領(lǐng)域建模,IT 項(xiàng)目管理 Dict.CN 在線(xiàn)詞典, 英語(yǔ)學(xué)習(xí), 在線(xiàn)翻譯

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks
            給定一個(gè)長(zhǎng)度為N的整數(shù)數(shù)組,只允許用乘法,計(jì)算任意(N-1)個(gè)數(shù)的組合乘積中最大的一組,并
    寫(xiě)出算法的時(shí)間復(fù)雜度。
           最容易想到的就是通過(guò)一次遍歷把所有(N-1)個(gè)數(shù)的組合找出來(lái),分別計(jì)算他們的乘積,并比較
    大小。由于總共有N個(gè)(N-1)個(gè)數(shù)的組合,總的時(shí)間復(fù)雜度為O(N的2次方),顯然這不是最好的解決
    辦法。
           且看下面的實(shí)現(xiàn)方法,當(dāng)然也是比較簡(jiǎn)單的,畢竟沒(méi)太多時(shí)間思考,他的時(shí)間復(fù)雜度只有O(N)。
           當(dāng)然肯定有其他的方式解決這個(gè)問(wèn)題,blog友如果有好的方式可以貼出來(lái)分享。謝謝!
     
     1package org.blogjava.arithmetic;
     2
     3import java.util.ArrayList;
     4
     5/**
     6 * @author Jack.Wang
     7 * @see http://jack2007.blogjava.net/
     8 */

     9public class Array<E> extends ArrayList<E> {
    10    private static final long serialVersionUID = 7799621696481440826L;
    11
    12    private static long maxOfSubArray(Array arr) {
    13        // 最大值
    14        long max = 0;
    15        int size = arr.size();
    16        // s[i]表示前i個(gè)元素的乘積,可知s[i]=s[i-1]*arr.get(i-1) 其中(1<=i<=N)
    17        long[] s = new long[size + 1];
    18        s[0= 1;
    19        // t[i]表示i后面元素的乘積,可知t[i]=t[i+1]*arr.get(i) 其中(1<=i<=N)
    20        long[] t = new long[size + 1];
    21        t[size] = 1;
    22        // 設(shè)p[i]為除第i個(gè)元素之外的其他元素之積,即:p[i]=s[i-1]*t[i+1];
    23        long[] p = new long[size + 1];
    24
    25        // 求出 s數(shù)組
    26        for (int i = 1; i <= size; i++{
    27            s[i] = s[i - 1* ((Integer) arr.get(i - 1));
    28        }

    29        // 求出t數(shù)組
    30        for (int i = size - 1; i >= 0; i--{
    31            t[i] = t[i + 1* ((Integer) arr.get(i));
    32        }

    33        // 計(jì)算 p數(shù)組
    34        for (int i = 1; i <= size; i++{
    35            p[i] = s[i - 1* t[i];
    36            if (p[i] > max) {
    37                max = p[i];
    38            }

    39        }

    40        return max;
    41    }

    42
    43    public static void main(String[] args) {
    44        Array<Integer> array = new Array<Integer>();
    45        array.add(1);
    46        array.add(4);
    47        array.add(6);
    48        array.add(10);
    49        array.add(12);
    50        array.add(40);
    51        // 上面的數(shù)字很簡(jiǎn)單,口算也知道N-1個(gè)最大乘積為115200
    52        // 算法結(jié)果:
    53        System.out.println(" 算法結(jié)果:" + maxOfSubArray(array));
    54    }

    55
    56}

    57




    本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請(qǐng)注明出處,如有版權(quán)問(wèn)題請(qǐng)及時(shí)通知。由于博客時(shí)間倉(cāng)促,錯(cuò)誤之處敬請(qǐng)諒解,有任何意見(jiàn)可給我留言,愿共同學(xué)習(xí)進(jìn)步。
    posted on 2008-10-17 12:43 Jack.Wang 閱讀(4806) 評(píng)論(11)  編輯  收藏 所屬分類(lèi): 數(shù)學(xué)&算法

    Feedback

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-17 13:33 wpf
    這個(gè) ,從 n個(gè)數(shù)據(jù)中找到最小的一個(gè),剩下的乘積最大,不就行了,當(dāng)然,為正數(shù)的情況下  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-17 14:17 Jack.Wang
    @wpf
    恩是的,可以分為三種情況:正數(shù),負(fù)數(shù),和零進(jìn)行分析,全為正數(shù)時(shí),除去最小的那個(gè),剩下的乘積就是最大的!當(dāng)然其他情況也可進(jìn)一步分析,也是一個(gè)不錯(cuò)的解決方式。復(fù)雜度也是big O N,等我把這種方式補(bǔ)上!謝謝!  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-17 17:00 Eric Jiang
    整數(shù)當(dāng)然應(yīng)該不能排除負(fù)數(shù)和零的情況。
    把所有數(shù)乘起來(lái),分別再整除每個(gè)數(shù),保留最大的。  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-17 17:06 YYX
    @Eric Jiang
    關(guān)鍵不可能把所有數(shù)乘起來(lái),除非你借用BigDecimal之類(lèi)的類(lèi)  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-17 17:55 ZelluX
    @YYX
    n個(gè)數(shù)乘起來(lái)不可能做到,n-1個(gè)數(shù)就可以了?  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-17 20:05 Jack.Wang
    @YYX
    確實(shí)存在溢出問(wèn)題,基本上那種算法都會(huì)涉及到多數(shù)相乘,所以用 bigdecimal 表述數(shù)字是需要的!  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-17 20:59 小亮Web
    難 等結(jié)果  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題[未登錄](méi) 2008-10-17 22:27 ol_soft
    @wpf
    同意啊  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-18 03:55 ZelluX
    其實(shí)壓根就不用乘法吧。。。  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-18 16:41 wpf
    這個(gè)是不是沒(méi)要求最后乘法的結(jié)果,只要得到n-1分別是那些就好了吧,呵呵
    這樣基本上不用考慮溢出的情況  回復(fù)  更多評(píng)論
      

    # re: 微軟面試題---求子數(shù)組最大乘積問(wèn)題 2008-10-22 18:28 stonebow
    一次遍歷,如果遇到兩個(gè)零就不用算了;然后分別記錄最小正數(shù)和最大負(fù)數(shù)和最小負(fù)數(shù)。盡量保證所選數(shù)里有偶數(shù)個(gè)負(fù)數(shù),如果為奇數(shù)個(gè)的話(huà)就用里面的絕對(duì)值最小的負(fù)數(shù)換外面絕對(duì)值最大的正數(shù),或用絕對(duì)值最小的正數(shù)換外面絕對(duì)值最大的負(fù)數(shù)。只要有一個(gè)正數(shù)就沒(méi)問(wèn)題,如果都是負(fù)數(shù)就要看N的奇偶性了。反正一次遍歷總能找到這些數(shù),然后可以根據(jù)判斷條件得出答案  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲中文字幕日产乱码高清app| 四色在线精品免费观看| 亚洲免费福利在线视频| 免费的涩涩视频在线播放| 免费在线观看黄色毛片| 亚洲中文字幕无码日韩| 亚洲国产精品第一区二区| 亚洲人成电影网站久久| 日本永久免费a∨在线视频| 在线观看人成视频免费无遮挡 | 色偷偷噜噜噜亚洲男人| 国产精品美女久久久免费| 91av在线免费视频| 四虎成人免费网站在线| 久久精品国产亚洲7777| 亚洲日本在线看片| 亚洲AV无码国产剧情| 成全视频在线观看免费| 巨胸喷奶水视频www网免费| 久久亚洲AV无码西西人体| 亚洲精品午夜在线观看| 老司机午夜精品视频在线观看免费 | www.av在线免费观看| 24小时在线免费视频| 又色又污又黄无遮挡的免费视| 亚洲成AV人片在线观看无码 | 国产亚洲福利在线视频| av网站免费线看| 日韩免费a级毛片无码a∨| 久久久久无码专区亚洲av| 亚洲人成电影院在线观看| 九九免费精品视频在这里| aⅴ免费在线观看| 亚洲综合最新无码专区| 亚洲一区中文字幕在线电影网| 午夜在线免费视频| 成年人免费的视频| 国产AV无码专区亚洲AV漫画| 久久亚洲精品国产亚洲老地址| 中文在线观看国语高清免费| 女人18毛片免费观看|