常用二分查詢模板
//二分查詢各種情況編寫練習
public class BinarySearch {
//精確查詢---用遞迴實現二分查詢,精確查詢目標元素的位置,假定陣列遞增排列,且不存在重複元素
public int bsearch1(int array[],int low,int high,int target){
if(low > high) return -1;
int mid = low + (high - low)/2;
if(array[mid] > target){
return bsearch1(array ,low,mid-1,target);
}
if(array[mid] < target){
return bsearch1(array,mid+1,high,target);
}
return mid;
}
//精確查詢---用迭代的方式實現二分查詢,精確查詢目標元素的位置,假定陣列遞增排列,且不存在重複元素
public int bsearch2(int array[],int low,int high,int target){
while(low <= high){
int mid = low + (high - low)/2;
if(array[mid] > target){
high = mid -1;
}
else if(array[mid] < target){
low = mid + 1;
}
else{
return mid;
}
}
return -1;
}
//界限查詢----用二分查詢尋找上屆,正好大於目標數的那個數(嚴格界限,不包含自身)
public int bsearchupperbound(int array[],int low,int high,int target){
if(low > high || target >= array[high]){
return -1;
}
while(low < high){
int mid = low + (high - low)/2;
if(array[mid] > target){
high = mid;
}
else{
low = mid + 1;
}
}
return high;
}
//界限查詢---用二分查詢尋找下屆,正好小於目標數的那個數(嚴格界限,不包含自身)
public int bsearchlowerbound(int array[],int low,int high,int target){
if(low > high || target <= array[low]){
return -1;
}
while(low < high){
int mid = (low + high + 1) / 2; //這裡用向上取整,否則陷入死迴圈 因為low無法往上爬超過high
if(array[mid] < target){
low = mid;
}
else{
high = mid -1;
}
}
return low;
}
//界限查詢---用二分查詢尋找上屆,正好大於等於目標數的那個數(鬆散界限,可以包含自身)
public int bsearch5(int array[], int low,int high,int target){
if(low > high || target > array[high]){
return -1;
}
while(low < high){
int mid = low + (high -low)/2;
if(array[mid] >= target){
high = mid;
}
else{
low = mid + 1;
}
}
return high;
}
//界限查詢---用二分法尋找下屆,正好小於等於目標的那個數 (鬆散界限,可以包含自身)
public int bsearch6(int array[],int low,int high,int target){
if(low > high || target < array[low]){
return -1;
}
while(low < high){
int mid = (low + high + 1)/2;
if(array[mid] <= target){
low = mid;
}
else{
high = mid - 1;
}
}
return low;
}
//用二分查詢找尋區域,找到目標元素出現的下標範圍,允許重複元素(先找到嚴格上屆和嚴格下屆)
public int[] searchRange(int[] array, int low, int high,int target){
int[] results = {-1,-1};
if(low > high){
return results;
}
int lower = bsearchlowerbound(array, 0, array.length -1, target);
lower = lower + 1;
if(array[lower] == target){
results[0] = lower;
}
else{
return results;
}
int upper = bsearchupperbound(array, 0, array.length - 1, target);
upper = upper < 0 ? (array.length - 1) : (upper -1);
results[1] = upper;
return results;
}
相關推薦
常用二分查詢模板
//二分查詢各種情況編寫練習 public class BinarySearch { //精確查詢---用遞迴實現二分查詢,精確查詢目標元素的位置,假定陣列遞增排列,且不存在重複元素 public int bsearch1(int array[],i
簡單二分查詢模板(查詢)
1 # include <stdio.h> 2 3 int search(int a[], int n, int v) //這個好像是效率最高的 4 { 5 int left = -1, right = n, middle; 6 while(left+1 !=
二分查詢模板總結(遞迴與迴圈遍歷兩個版本)
二分查詢: 思路: 在有序*陣列***a[]中查詢K 1,不斷分割 。 2 用中間值去比較。 ====================嘗試比較下面兩種,得到遞迴函式的寫法=========
二分查詢的模板
while (low <= high) { int middle = (low + high) / 2; if (target == nums[middle]) {
javascript常用陣列排序及二分查詢
1. 氣泡排序 基本思路:依次比較相鄰的兩個數的大小,若大數在前、小數在後,則交換兩個數的位置,依次比較直至全部資料從小到大排好序 function sort_bubble(arr) { var len = arr.length; for (var i = 0;
二分與三分查詢模板
可參考https://wenku.baidu.com/view/3f0805820740be1e650e9a8c.html 二分查詢 a[] 是有序的 成升序或降序 int find(int a[])//假定是在0到100之間搜尋 l取最左邊 r 取最右邊
ACM 二分查詢 二分答案 模板
我自己的模板 int l=0,r=100,ans=0; while(l<=r) { mid=(l+r)/2; if (check(mid)) {l=mid+1;ans = mid
LIS 最長上升子序列 (n*logn) 模板 (二分查詢+遞迴)
最長上升子序列是很早就接觸了的問題了,一直用的是動態規劃n*n的方法,也知道那不是最好的,可以優化,今天看部落格無意中看到LIS,LCS兩個詞,就特意找了部落格看了看,主要是理解一下這裡的思想,其實蠻複雜難懂的,自己很難說清楚,還是得引用人家的部落格才行。點選開
二分查詢實用模板
二分查詢,又叫折半查詢。網上有很多寫法,但是經過總結之後發現這個模板是最管用的。 說一下這個二分模板的作用:找到的話且這個數唯一則返回下標位置,如果不唯一則返回最右邊的下標;找不到的話返回比它大的第一個數(即右邊的數)的下標。注意程式碼,經過細微的修改可以達到不同的效果
SQL常用查詢模板(個人在公司最常用的)
sql server t-sql高階查詢 新增欄位: alter table [表名] add [欄位名] nvarchar (50) null alter table [表名] alter column [欄位名] varchar(100) not
collection類的工具類,collections,二分查詢,折半查詢,collections的常用方法,MAP的使用,
Collections:collection類的工具類。用來操作collection類 1:Static int binarySearch(List list, Object key);:二分
過載實現:int char二分查詢. 函式模板 :對整型 浮點型 字元型 實現氣泡排序
程式:演算法+資料 C++語言的資料: 1、基本型別: 整型,浮點型,字元型,bool型別 2、變數:此塊空間的內容可改變 型別 變數名;//分配空間:以型別 初始化變數:在定義變數同時賦初值 引用:通過名字引用變數的內容
Java中常用的查詢演算法——順序查詢和二分查詢
import java.util.Scanner; /* * 順序查詢 */ public class SequelSearch { public static void main(String[] arg) { int[] a={4,6,2,8,1,9,0,3}; Scann
二分查詢法(C++ 模板實現)
/*演算法總結 二分查詢法: 二分查詢法的前提是資料已經排序,時間平均複雜度為 O(lgn) 歡迎轉載,轉載請註明作者 [email protected] */ #include <iostream> #include <stdi
Elasticsearch5.0 Java Api(八) -- 常用DSL查詢
stack pub metrics get ddr 結果 dsl onclick bsp 測試常用的DSL組合查詢功能 1 package com.juyun.test; 2 3 import java.net.InetAddress;
常用SQL查詢語句
edate 查詢更新 如果 子查詢 升序 運行 查詢 結構 薪酬 一、簡單查詢語句 1. 查看表結構 SQL>DESC emp; 2. 查詢所有列 SQL>SELECT * FROM emp; 3. 查詢指定列 SQL>SELECT empmo,
【樹狀數組區間加+區間查詢模板】洛谷P3372
typedef 記錄 using main == str ios namespace arp 雖然說這道題線段樹很好做,但畢竟樹狀數組常數小又好寫,所以還是寫個模板吧。 區間加轉為前綴加 區間和轉為前綴和 我們討論一個1~k的區間加x對於一個前綴和val【i】的影響 對於所
HDU-1754 I Hate It(線段樹、點變化+段查詢---模板)
區間 printf desc d+ ++ pda ava des mission I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot
常用mysql查詢命令
說明 hang 地址 遭遇 導出文件 mark error uniq 數據 1、連接Mysql 格式: mysql -h主機地址 -u用戶名 -p用戶密碼 1、連接到本機上的MYSQL。 首先打開DOS窗口,然後進入目錄mysql\bin,再鍵入命令mysql -u r
假期的宿舍——二分圖模板一個
style play close 技術分享 vector namespace ios cli tdi 因為題目並沒有給出自己認識自己的數據,所以需要手動從每一個學生向他的床上連一條邊,找這個錯誤找了一個小時。 1 #include<algorithm&