Leetcode演算法系列六(二分查詢與二叉查詢樹)

2021-10-10 17:29:59 字數 3283 閱讀 1788

預備知識:二分查詢基礎知識

例1:插入位置(easy) (二分查詢)

例2:區間查詢(medium) (二分查詢)

例3:旋轉陣列查詢(medium) (二分查詢)

預備知識:二叉查詢(排序)樹基礎知識

例4:二叉查詢樹編碼與解碼(medium)

例5:逆序數(hard) (二叉查詢樹應用)

搜尋插入位置

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

你可以假設陣列中無重複元素。

示例 1:

輸入: [1,3,5,6], 5

輸出: 2

示例 2:

輸入: [1,3,5,6], 2

輸出: 1

示例 3:

輸入: [1,3,5,6], 7

輸出: 4

示例 4:

輸入: [1,3,5,6], 0

輸出: 0

public

class

solution

else

if(nums[mid]

>target)

end=mid-1;

}else

begin=mid+1;

}}return index;

}}

在排序陣列中查詢元素的第乙個和最後乙個位置

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。

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

如果陣列中不存在目標值,返回 [-1, -1]。

示例 1:

輸入: nums = [5,7,7,8,8,10], target = 8

輸出: [3,4]

示例 2:

輸入: nums = [5,7,7,8,8,10], target = 6

輸出: [-1,-1]

public

class

solution

public

intsearchleft

(int

nums,

int target)

else

}else

if(nums[mid]

>target)

else

}return-1

;}public

intsearchright

(int

nums,

int target)

else

}else

if(nums[mid]

>target)

else

}return-1

;}}

public

class

solution

else

if(target)else

}else

if(nums[begin]

>nums[mid]

)else

if(nums[begin]

==nums[mid])}

else

if(target>nums[mid]

)else

}else

if(nums[begin]

)else

if(nums[begin]

==nums[mid])}

}return-1

;}}

/**

* definition for a binary tree node.

* public class treenode

* }*/public

class

codec

else

}public

void

bts_pre

(treenode root,stringbuilder result)

else

}// decodes your encoded data to tree.

public treenode deserialize

(string data)

string array[

]=data.

split

("#");

treenode result=

newtreenode

(integer.

parseint

(array[0]

));for

(int i=

1;i)return result;

}public

void

bts_pre_build

(treenode result,

int insert)

else

}else

else}}

}// your codec object will be instantiated and called as such:

// codec ser = new codec();

// codec deser = new codec();

// string tree = ser.serialize(root);

// treenode ans = deser.deserialize(tree);

// return ans;

class

btsnode

}public

class

solution

int n=nums.length;

btsnode root=

newbtsnode

(nums[n-1]

);//第乙個結點,從尾部開始

stack.

add(0)

;//第乙個結點

for(

int i=n-

2;i>=

0;i--

)while

(!stack.

empty()

)return result;

}/**

*構造二叉搜尋樹,並計算count_small

* */

public

void

bts(btsnode root,btsnode insert)

else

}else

else}}

}

演算法系列之六 二叉查詢樹

簡介 二叉查詢樹是一種資料結構,它支援多種動態集合操作。在二叉查詢樹上執行的基本操作的時間與樹的高度成正比。對於一棵含有n個節點的完全二叉樹,這些操作的最壞情況執行時間為o n 結構體 一棵二叉查詢樹按二叉樹結構來組織的。二叉查詢樹節點 struct treenode 性質 設x為二叉查詢樹上的乙個...

排序演算法(六)二分雙插入排序

1 為減少二分插入排序中的比較及移動次數,可考慮一次以兩個資料為單位進行插入。以公升序為例,每次插入時先找出兩個待插入資料中的較大者,按二分查詢法確定其位置,在向後移動已有序記錄時一次移動兩個位置 因為較小記錄肯定將來放在較大記錄之前 插入較大資料後再按傳統二分插入排序演算法在較大資料所處位置與第一...

演算法基礎 典型題(六)二分搜尋 與 二分查詢樹

記錄演算法基礎題思路 step1 插入位置查詢 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 輸入 1,3,5,6 5 輸出 2 int searchinsert vector nums,in...