2020-10-30每天一刷
力扣33 搜尋旋轉排序陣列
給你一個升序排列的整數陣列 nums ,和一個整數 target 。
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。(例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
請你在陣列中搜尋 target ,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。
示例 1:
輸入:nums = [4,5,6,7,0,1,2], target = 0
輸出:4
示例 2:
輸入:nums = [4,5,6,7,0,1,2], target = 3
輸出:-1
示例 3:
輸入:nums = [1], target = 0
輸出:-1
提示:
1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
nums 中的每個值都 獨一無二
nums 肯定會在某個點上旋轉
-10^4 <= target <= 10^4
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路:target == nums[mid] 就返回mid;通過nums[begin]和nums[mid]來區分那一部分是有序的,那一部分不是有序的,從而縮小搜素的範圍。
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
if(!n){
return -1;
}
if(n == 1){
return target == nums[0] ? 0 : -1;
}
int begin =0;
int end = nums.size()-1;
while(begin <= end){//這裡取等號是因為閉區間
int mid = begin + (end - begin) / 2;
if(target == nums[mid]){
return mid;
}
if(nums[begin] <= nums[mid]){//[3,1] target = 1時
if(target >= nums[begin] && target < nums[mid]){//邊界值,要取等號
end = mid - 1;
}
else
begin = mid + 1;
}
else{
if(target > nums[mid] && target <= nums[end]){//注意邊界值要取等號
begin = mid + 1;
}
else{
end = mid -1;
}
}
}
return -1;
}
};
二叉排序樹
- 左子樹不為空,怎左子樹上的所有節點的值均小於或者等於它的根節點的值;
- 若右子樹不為空,則右子樹上所有節點的值均大於或者等於它的根節點的值;
- 左右子樹也分別為二叉排序樹。
- 等於的情況只能出現在左子樹或者右子樹中的某一側。
二叉查詢樹的中序遍歷是從小到大的,故又名二叉排序樹。
二叉排序樹的建立
#include "util.h"
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};
//在一個BST樹中插入一個新的節點
void BST_insert(TreeNode* node,TreeNode* insert_node){
if (insert_node->val < node->val){
if (node->left){
BST_insert(node->left,insert_node);
}
else{
node->left = insert_node;
}
}
else{
if (node->right){
BST_insert(node->right,insert_node);
}
else{
node->right = insert_node;
}
}
}
//前序列印BST樹
void preorder_print(TreeNode* node, int layer){
if(!node){
return;
}
for (int i = 0; i < layer; ++i) {
printf("-----");
}
printf("%d\n",node->val);
preorder_print(node->left,layer+1);
preorder_print(node->right,layer+1);
}
//查詢某一節點是否在BST二叉樹中
bool BST_search(TreeNode* node, int value){
if(node->val == value){
return true;
}
if(value < node->val){
if(node->left){
BST_search(node->left,value);
}
return false;
}
else{
if (node->right){
BST_search(node->right,value);
}
else{
return false;
}
}
}
int main(){
//建一個根節點為8的樹
TreeNode root(8);
vector<TreeNode*> node_vec;
int test[]= {3,10,1,6,15};
for (int i = 0; i < 5; ++i) {
node_vec.push_back(new TreeNode(test[i]));
}
for (int i = 0; i < node_vec.size(); ++i) {
BST_insert(&root,node_vec[i]);
}
preorder_print(&root, 0);
return 0;
}
相關文章
- 2020-10-31每天一刷
- 2020-10-30
- Go 每週一刷1.0Go
- 2020-10-30 ACM實踐報告部分程式題ACM
- ZG前端學習第二天2020-10-30前端
- hot100-一刷-04子串(共3道題)
- hot100-一刷-02雙指標(共4道題)指標
- hot100-一刷-03滑動視窗(共2道題)
- 每天給自己打分
- javaWeb 每天積極向上JavaWeb
- JSTL 每天積極向上JS
- 每天都在挑戰極限...
- 每天學點node系列-zlib
- 每天學點node系列-httpHTTP
- 每天學點node系列-stream
- 每天讀一點webpack-001Web
- 每天一個爬蟲-learnku爬蟲
- 真的需要“每天8杯水”嗎?
- 每天一個小技巧(四)
- 金九銀十要來了?不要慌,這些Android BAT高階面試題刷一刷AndroidBAT面試題
- 每天一邊js -- 回到頂部JS
- 每天一個Linux命令(1):xargsLinux
- 每天加班的你,真的會工作嗎?
- Minesweeper - 每天一把CF - 20201112
- 3.每天堅持要做的事情
- 每天都在糾結與迷茫中徘徊
- 每天學一個 Linux 命令(15):manLinux
- 每天學一個 Linux 命令(13):touchLinux
- 每天分享一個Python庫-ChardetPython
- 《科學》:每天兩升水,可能喝多了!
- win10設定每天定時開機方法_win10如何設定每天自動開機Win10
- 每天一個設計模式·策略模式設計模式
- 每天學習一個Linux命令-目錄Linux
- 每天一個設計模式·代理模式設計模式
- Nginx每天莫名自動重啟問題Nginx
- 每天一個Linux命令(6):rmdir命令Linux
- 每天一個Linux命令(5):rm命令Linux
- 每天一個Linux命令(2):shutdown命令Linux