[劍指Offer]---11 旋轉數組的最小數字與12 矩陣中的路徑

11 旋轉數組的最小數字

題目

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如,數組 [3,4,5,1,2] 爲 [1,2,3,4,5] 的一個旋轉,該數組的最小值爲1。  

示例 1:

輸入:[3,4,5,1,2]
輸出:1

示例 2:

輸入:[2,2,2,0,1]
輸出:0

思路

旋轉數組其實是由兩個有序數組拼接而成的,因此我們可以使用二分法

(1)array[mid] > array[high]:

出現這種情況的array類似[3,4,5,6,0,1,2],此時最小數字一定在mid的右邊。
low = mid + 1

(2)array[mid] == array[high]:

出現這種情況的array類似 [1,0,1,1,1] 或者[1,1,1,0,1],\此時最小數字不好判斷在mid左邊還是右邊,這時只好一個一個試 。
high = high - 1

(3)array[mid] < array[high]:

出現這種情況的array類似[2,2,3,4,5,6,6],此時最小數字一定就是array[mid]或者在mid的左
邊。因爲右邊必然都是遞增的。
high = mid


class Solution {
public:
    int minArray(vector<int>& numbers) {
        int low=0,high=numbers.size()-1;
      
        while (low<high)
        {
            int mid=(high+low)/2;

            if(numbers[mid]>numbers[high]){
                low=mid+1;
            }
            else if (numbers[mid]==numbers[high])
            {
                high-=1;
            }
            else{
                high=mid;
            }

        }
        
        return numbers[low];
    }
};

 

12 矩陣中的路徑

題目

請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格子。例如,在下面的3×4的矩陣中包含一條字符串“bfce”的路徑(路徑中的字母用加粗標出)。

[["a","b","c","e"],
["s","f","c","s"],
["a","d","e","e"]]

但矩陣中不包含字符串“abfb”的路徑,因爲字符串的第一個字符b佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入這個格子。

 

示例 1:

輸入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
輸出:true

示例 2:

輸入:board = [["a","b"],["c","d"]], word = "abcd"
輸出:false

提示:

    1 <= board.length <= 200
    1 <= board[i].length <= 200。

思路

利用回溯法求解

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if (board.empty() || board[0].empty()) 
            return word.empty();


        for (size_t i = 0; i < board.size(); i++)
        {
            for (size_t j = 0; j < board[0].size(); j++)
            {
                   if (search(board, i, j, word, 0))
                      return true;
            }
            
        }
        return false;
    }


    bool search(vector<vector<char>>& board, int i,int j,string word,int idx){
        if(idx==word.size()){
            return true;
        }

        if (i < 0 || i >= board.size()    || 
            j < 0 || j >= board[0].size() ||
            board[i][j] != word[idx]){
                return false;
            }
           
        board[i][j] = '*';
        bool res = search(board, i - 1, j, word, idx + 1) ||
                   search(board, i + 1, j, word, idx + 1) ||
                   search(board, i, j - 1, word, idx + 1) ||
                   search(board, i, j + 1, word, idx + 1);
        board[i][j]= word[idx];
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章