最基本的二分查詢場景,在乙個有序陣列中搜尋乙個數字,若存在返回其下標,否則返回-1 :
int binarysearch(vector& nums, int target)
return -1;
}
while迴圈中的條件:
若right初始化為nums.size(),則搜尋區間變為[left,right) ,迴圈退出條件為left == right,決定了while迴圈寫法為 while(left < right) 。需要注意的是,當left==right時退出迴圈,最後需要額外判斷一下nums[left]是否等於target。
left=mid+1 or left=mid ...
跟搜尋區間有關,當[left,right]兩端閉合時,下一步要搜尋的一定是[left,mid-1],[mid+1,right],因為mid已經搜尋過,應該從搜尋區間中去除。
例題:劍指offer 53
right初始化為nums.size()-1,搜尋區間兩端閉合時:
int left= 0, right = nums.size()-1, leftindex=0 ;
while(left<=right) else if (nums[mid] < target) else if (nums[mid] > target)
}return left;
}
right初始化為nums.size()-1,搜尋區間兩端閉合時:
// 尋找右邊界
int left= 0, right = nums.size()-1, rightindex=0 ;
while(left<=right) else if (nums[mid] < target) else if (nums[mid] > target)
}return left - 1; // 注意
}
便於記憶,將right統一初始化為nums.size()-1,搜尋區間為兩端閉合[left,right],左右區間變化為left=mid+1,right=mid-1。需要注意while迴圈的退出條件,以及退出後判斷索引越界! 二分查詢總結
今天上csdn,發現一篇關於二分查詢演算法的文章被置頂,回帖也相當熱烈。我覺得演算法總重要的還是要了解思想,至於程式設計技巧則是其次。二分查詢在計算中演算法中的重要性不言而喻,許多變形的演算法都是基於此演變的,比如二分查詢樹等。所以此演算法程式我也打算總結一下。當然經典的演算法討論莫過於jon be...
二分查詢總結
我們假設乙個最簡單的環境,對於數x,按要求詢問它在乙個陣列a 假設從小到大 裡的位置,陣列個數為n。1.查詢最後乙個小於x的數的位置 常見的一種要求。返回小於x的其中的最右邊乙個數的下標。int half int x return r 2.查詢最後乙個小於或等於x的數的位置 返回小於或等於x的其中的...
二分查詢總結
二分查詢其實並不簡單 這個演算法有很多版本 而且變化也比較多 稍一不留神就容易寫錯 這裡總結一下 一般二分查詢 binary serach int f int array,int key,int len else cout return 1 注意判斷條件必須要這麼寫 因為比如奇數個元素 1,3,5 ...