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;
}
};