中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

          Java專題文章博客和開源

          常用鏈接

          統(tǒng)計

          最新評論

          在旋轉(zhuǎn)有序數(shù)組內(nèi)找特定的值

            要求
            給定一沒有重復(fù)元素的旋轉(zhuǎn)數(shù)組(它對應(yīng)的原數(shù)組是有序的),求給定元素在旋轉(zhuǎn)數(shù)組內(nèi)的下標(biāo)(不存在的返回-1)。
            例如
            有序數(shù)組為{0,1,2,4,5,6,7},它的一個旋轉(zhuǎn)數(shù)組為{4,5,6,7,0,1,2}.
            元素6在旋轉(zhuǎn)數(shù)組內(nèi),返回2
            元素3不在旋轉(zhuǎn)數(shù)組內(nèi),返回-1
            分析托福答案
            遍歷一遍,可以輕松搞定,時間復(fù)雜度為O(n),因為是有序數(shù)組旋轉(zhuǎn)得到,這樣做肯定不是最優(yōu)解。有序,本能反映用二分查找,舉個例子看看特點
            可以看出中間位置兩段起碼有一個是有序的(不是左邊,就是右邊),那么就可以在有序的范圍內(nèi)使用二分查找;如果不再有序范圍內(nèi),就到另一半去找。
            參考代碼
            復(fù)制代碼
            int search(int A[], int n, int target) {
            int beg = 0;
            int end = n - 1;
            while (beg <= end)
            {
            int mid = beg + (end - beg) / 2;
            if(A[mid] == target)
            return mid;
            if(A[beg] <= A[mid])
            {
            if(A[beg] <= target && target < A[mid])
            end = mid - 1;
            else
            beg = mid + 1;
            }
            else
            {
            if(A[mid] < target && target <= A[end])
            beg = mid + 1;
            else
            end = mid - 1;
            }
            }
            return -1;
            }
            復(fù)制代碼
            擴展
            上邊的有求是沒有重復(fù)的元素,現(xiàn)在稍微擴展下,可以有重復(fù)的元素,其他的要求不變。
            思路雅思答案
            大致思路與原來相同,這是需要比較A[beg] 與 A[mid]的關(guān)系
            A[beg] < A[mid] ----左邊有序
            A[beg] > A[mid] ----右邊有序
            A[beg] = A[mid] ----++beg
            復(fù)制代碼
            bool search(int A[], int n, int target) {
            int beg = 0;
            int end = n - 1;
            while (beg <= end)
            {
            int mid = beg + (end - beg) / 2;
            if(A[mid] == target)
            return true;
            if(A[beg] < A[mid])
            {
            if(A[beg] <= target && target < A[mid])
            end = mid - 1;
            else
            beg = mid + 1;
            }
            else if(A[beg] > A[mid])
            {
            if(A[mid] < target && target <= A[end])
            beg = mid + 1;
            else
            end = mid - 1;
            }
            else
            ++beg;
            }
            return false;
            }

          posted on 2014-04-26 13:33 好不容易 閱讀(181) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          PK10開獎 PK10開獎
          主站蜘蛛池模板: 二连浩特市| 东乌珠穆沁旗| 前郭尔| 奇台县| 黄龙县| 广安市| 河津市| 咸阳市| 和田县| 河东区| 崇义县| 黄冈市| 水富县| 年辖:市辖区| 商水县| 饶平县| 疏勒县| 吉木乃县| 遂平县| 拜泉县| 锡林郭勒盟| 河东区| 汕尾市| 禹城市| 当涂县| 麻栗坡县| 高台县| 古田县| 通州区| 中山市| 永寿县| 东辽县| 丰都县| 府谷县| 伊通| 常州市| 嘉鱼县| 茶陵县| 儋州市| 云龙县| 日喀则市|