leetcode 之 旋轉陣列問題

2021-09-03 00:09:30 字數 1874 閱讀 8096

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 o(log n) 級別。

#inlcude class solution else

}else

}else elseelse}}

}}

return -1;

}};

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。

編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。

class solution else

}else

}else if (nums[mid] < nums[l])elseelse

}}else

}return false;

}};

注:再可重複陣列中查詢元素的方法均可適用於非重複陣列的元素查詢問題上,所以該題的解法同樣適合解決第乙個問題

給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。

class solution else if (left>=1 && left+1< nums.size() && nums[left] < nums[left-1] && nums[left] < nums[left+1])else if (right >= 1 && right+1 < nums.size() && nums[right] < nums[right-1] && nums[right] < nums[right+1])else else }}

// (0, nums.size()-1)之間沒有找到最小值, 那麼最小元素肯定存在於兩端

return nums[0]>nums[nums.size()-1]? nums[nums.size()-1]: nums[0];

}};

在該題目中,要求是查詢最小元素切陣列有序,在一般情況下是使用二分查詢法可以快速的查詢到元素,但是**看起來比較繁瑣,在此我沒有使用二分查詢法。

int findmin(vector& nums) 

return nums[i];

}

情況一:先判斷陣列是否只有乙個元素,如果是這樣的話直接返回第乙個元素即可,這就是最小值。

情況二:陣列元素至少有兩個及以上。首先找到最小值的條件是array[i]>=array[i-1] ,我採用前乙個元素和後乙個元素進行比較,如果array[i] >= array[i-1]則i++, 直到for迴圈停止。如果在for迴圈中找到最小值時,那麼就直接返回最小值。如果找不到,那麼array[array.size()-1]就是最小值,返回即可。

時間複雜度分析:

最壞情況:o(n)

最好情況:o(1)

平均時間複雜度:o(n/2)

隨著資料的增大,這樣的時間複雜度要比二分查詢效率低。所以建議採用二分查詢演算法實現吧。

int left = 0;

int right = nums.size()-1;

while (left < right)else if (nums[mid] < nums[right])else

}return nums[left];

查詢元素之返回下標

可重複陣列查詢元素是否存在

最小值查詢

LeetCode之旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1,2,3,4,5,6,7 和 k 3 輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2,3,...

LeetCode 旋轉陣列

將包含n 個元素的陣列向右旋轉 k 步。例如,如果 n 7 k 3,給定陣列 1,2,3,4,5,6,7 向右旋轉後的結果為 5,6,7,1,2,3,4 注意 盡可能找到更多的解決方案,這裡最少有三種不同的方法解決這個問題。要求空間複雜度為 o 1 關聯的問題 反轉字串中的單詞 ii public ...

LeetCode 旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1,2,3,4,5,6,7 和 k 3輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2,3,4...