記錄演算法基礎題思路:
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 一般二分答案解決的問題是最優...