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

2021-10-05 16:34:16 字數 3450 閱讀 5562

記錄演算法基礎題思路:

step1

插入位置查詢: 

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

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

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

輸出: 2

int searchinsert(vector& nums, int target)  else if (target < nums[mid]) 

end = mid - 1;

} else

begin = mid + 1;}}

return 0; /* 實際不會進來 */

}

區間查詢:

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

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

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

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

輸出: [3,4]

public:

vectorsearchrange(vector& nums, int target)

private:

int find_left_pos(vector& nums, int target)

end = mid - 1;

} else if (target < nums[mid]) else if (target > nums[mid])

}return -1;

}int find_right_pos(vector& nums, int target)

begin = mid + 1;

} else if (target < nums[mid]) else if (target > nums[mid])

}return -1;

}

旋轉陣列查詢:

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

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

示例:輸入: nums = [4,5,6,7,0,1,2], target = 0

輸出: 4

int search(vector& nums, int target)  else if (target < nums[mid])  else 

/* 如果begin到mid為旋轉區間,mid到end為遞增區間 */

} else if (nums[begin] > nums[mid]) else

} else if (target > nums[mid]) else if (nums[begin] > nums[mid]) else

} else }}

return -1;

}

二叉查詢樹編碼解碼:

序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同乙個或另乙個計算機環境中重建。

設計乙個演算法來序列化和反序列化二叉搜尋樹。 對序列化/反序列化演算法的工作方式沒有限制。 您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字串反序列化為最初的二叉搜尋樹。

編碼的字串應盡可能緊湊。

public:

// encodes a tree to a single string.

/* 對查詢二叉樹進行前序遍歷,將遍歷到的結果按順序插入能得到相同的查詢二叉樹 */

string serialize(treenode* root)

void bst_preorder(treenode* root, string &res)

int val = root->val;

/* 前序遍歷,注意把字串反序,取值反算得到val更簡單, 用#分割資料 */

string tmp;

while (val != 0)

for (int i = tmp.size() - 1; i >= 0; i--)

res += '#';

bst_preorder(root->left, res);

bst_preorder(root->right, res);

}// decodes your encoded data to tree.

treenode* deserialize(string data)

vector node_vec;

int val = 0;

for (int i = 0; i < data.size(); i++) else

}for (int i = 1; i < node_vec.size(); i++)

return node_vec[0];

}void bst_insert(treenode* root, treenode* node) else

} else else }}

逆序數:

給定乙個整數陣列 nums,按要求返回乙個新陣列 counts。陣列 counts 有該性質: counts[i] 的值是  nums[i] 右側小於 nums[i] 的元素的數量。

示例:輸入: [5,2,6,1]

輸出: [2,1,1,0] 

二分搜尋基礎演算法

分治演算法基本思想 將乙個規模為 n 的問題分解為 k 個規模較小的子問題,這些子問題相互獨立且與原問題相同 給定已排好序的 n 個元素 array 0 n 1 現要在這 n 個元素找出特定元素x 首先較容易想到的是用順序搜尋方法,逐個比較 array 0 n 1 中元素,直至找出元素 x 或搜尋整...

演算法 二分搜尋

思路 首先從陣列中間的數把陣列分成兩部分,如果查詢的數比中間的數大,說明接下來需要查詢右邊的部分,令中間的的下標 1為下一次開始查詢的開始位置,再從low到high之間查詢,一直迴圈。root bogon code cat erfen.c include int work int x,int a,i...

二分(二分答案 二分搜尋)與單調性

經典二分搜尋是二分空間範圍。二分答案又叫二分猜值,是二分解的值空間。其實可以統一,普通的二分搜尋也是二分答案值域 下標空間,也是猜值。二分必須滿足單調性,最直觀的,二分搜尋只能在有序陣列上進行。單調性體現在,下標和元素值是單調的,也就是 if j i 有 a j a i 一般二分答案解決的問題是最優...