程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> LeetCode OJ (33)

LeetCode OJ (33)

編輯:關於C

\

這個題是將一個排序數組部分扭轉一下,導致數組成為部分有序的兩部分,現在給定一個target,最後找出該target的下標,若不存在則返回-1,題目意思還是很好理解的,但是求解的時候確實比較麻煩的。為什麼麻煩呢?因為遍歷一遍數組的方法並不適用,而且這樣的做法也沒有意義!

所以我們得另外開辟路徑,我們平時在查找有序數組的時候用的最多的方法是二分查找法,那麼這個題能否使用二分查找呢?答案是可以,而且就是用這種方法來查找target的下標的。思路如下:

雖然數組被扭轉了,並不是整個有序的,但是它還是部分有序的,舉個例子吧:如:”4 5 6 7 0 1 2“,我們可以看到數組的前後兩個部分還是有序的,我們可以利用這一點來求解,說道這裡我覺得不用再多多解釋了吧,直接看代碼吧:

 

class Solution {
public:
    int search(vector& nums, int target)
    { //這個題是給一個排序數組,但是數組裡面內容被平行移動了,如上例所示,現在要找到tagert所對應的下標
        int len = nums.size();
        
        //特殊情況先考慮掉
        if(len == 0)
        { return -1; }
        if(len == 1 && target!=nums[0])
        { return -1; }
        
        //正常情況,應該不能遍歷一邊數組吧,這樣沒有意義,應該也無法通過;雖然順序被打亂了,但是部分還是有序的,我們還是使用二分查找
        int left = 0;
        int right = len-1;
        int mid = 0;
        while(left <= right)
        {
            mid = left + (right-left)/2;
            
            if(target == nums[left])
            {
                return left;
            }
            if(target == nums[right])
            {
                return right;
            }
            if(target == nums[mid])
            {
                return mid;
            }
            
            //二分查找
            if(nums[mid] >= nums[left])
            {//左邊有序
                if(target > nums[left] && target < nums[mid])
                {
                    right = mid - 1;
                }
                else
                {
                    left = mid + 1;
                }
            }
            else
            {//右邊有序
                if(target > nums[mid] && target < nums[right])
                {
                    left = mid + 1;
                }
                else
                {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
};
結果如下,我是直接用這種求解的,遍歷的方法沒試,我覺得應該無法通過的,這類題算是對二分查找的延伸吧。

 

\
 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved