1. 程式人生 > >常用二分查詢模板

常用二分查詢模板

//二分查詢各種情況編寫練習

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&