2 - Binary Search & LogN Algorithm
254. Drop Eggs
https://www.lintcode.com/problem/drop-eggs/description?_from=ladder&&fromId=1
28. Search a 2D Matrix
https://www.lintcode.com/problem/search-a-2d-matrix/description?_from=ladder&&fromId=1
思路1:
1. find the row index, the last number <= target
2. find the column index, the number equal to target
public class Solution {
/**
* @param matrix: matrix, a list of lists of integers
* @param target: An integer
* @return: a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
// write your code here
if(matrix == null || matrix.length == 0) return false;
int left = 0, right = matrix[0].length - 1;
int row = findRow(matrix, target);
if(matrix[row][0] > target || matrix[row][right] < target) {
return false;
}
while(left + 1 < right) {
int mid = left + (right - left) / 2;
if(matrix[row][mid] == target) {
return true;
} else if(matrix[row][mid] > target) {
right = mid;
} else {
left = mid;
}
}
if(matrix[row][left] == target || matrix[row][right] == target) {
return true;
} else {
return false;
}
} public int findRow(int[][] matrix, int target) {
int top = 0, bottom = matrix.length - 1, right = matrix[0].length - 1;
while(top + 1 < bottom) {
int mid = top + (bottom - top) / 2;
if(matrix[mid][right] == target) {
return mid;
} else if(matrix[mid][right] > target) {
bottom = mid;
} else {
top = mid;
}
}
if(matrix[top][right] >= target) {
return top;
} else {
return bottom;
}
}
}
思路2:
1. 可以看作是一个有序数组被分成了n段,每段就是一行。因此依然可以二分求解。
对每个数字,根据其下标 i,j 进行编号,每个数字可被编号为 0 ~ n *(n - 1)
2. 相当于是在一个数组中的下标,然后直接像在数组中二分一样来做。取得 mid 要还原成二维数组中的下标,i = mid / n, j = mid % n
3. int start = 0, end = row * row * column - 1;
int number = matrix[mid / column][mid % column];
// Binary Search Once
public class Solution {
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
public boolean searchMatrix(int[][] matrix, int target) {
// write your code here
if(matrix == null || matrix.length == 0){
return false;
} if(matrix[0] == null || matrix[0].length == 0){
return false;
} int row = matrix.length;
int column = matrix[0].length; int start = 0, end = row * column - 1;
while(start <= end){
int mid = start + (end - start) / 2;
int number = matrix[mid / column][mid % column];
if(number == target){
return true;
}else if(number > target){
end = mid - 1;
}else{
start = mid + 1;
}
} return false; }
}
14. First Position of Target
https://www.lintcode.com/problem/first-position-of-target/description?_from=ladder&&fromId=1
思路:这道题很简单。套用二分法的模版即可
public class Solution {
/**
* @param nums: The integer array.
* @param target: Target to find.
* @return: The first position of target. Position starts from 0.
*/
public int binarySearch(int[] nums, int target) {
// write your code here
if(nums == null || nums.length == 0) return -1;
int start = 0, end = nums.length - 1;
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if(nums[mid] >= target) {
end = mid;
} else {
start = mid;
}
}
if(nums[start] == target) {
return start;
}
if(nums[end] == target) {
return end;
}
return -1;
}
}
414. Divide Two Integers
https://www.lintcode.com/problem/divide-two-integers/description?_from=ladder&&fromId=1
1. 凡是要移位,要做的第一件事就是把 int 转换成 long,为了防止移位时溢出。
2. 基本思路是利用减法,看看被除数可以减去多少次除数。使用倍增的思想优化,可以将减法的次数优化到对数的时间复杂度。
3. 我们将除数左移一位(或加上它自己),即得到了二倍的除数,这时一次相当于减去了两个除数,通过不断倍增,时间复杂度很优秀。
4. 与此同时,还需要一个变量记录此时的除数是最初除数的多少倍,每次减法后都加到结果上即可。
public class Solution {
/**
* @param dividend: the dividend
* @param divisor: the divisor
* @return: the result
*/
public int divide(int dividend, int divisor) {
// write your code here
if(divisor == 0) {
return dividend >= 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
if(dividend == 0) {
return 0;
}
if(divisor == -1 && dividend == Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
boolean isNegative = ((divisor > 0 && dividend < 0) || (divisor < 0 && dividend > 0)) ? true : false;
long divisorL = Math.abs((long)divisor);
long dividendL = Math.abs((long)dividend);
int result = 0;
while(dividendL >= divisorL) {
int shift = 0;
while(dividendL >= (divisorL << shift)) {
shift++;
}
result += 1 << (shift - 1);
dividendL -= divisorL << (shift - 1);
}
if(isNegative) {
return result * (-1);
}
return result;
}
}
61. Search for a Range
https://www.lintcode.com/problem/search-for-a-range/description?_from=ladder&&fromId=1
这道题同样很简单,套用模版即可。
public class Solution {
/**
* @param A: an integer sorted array
* @param target: an integer to be inserted
* @return: a list of length 2, [index1, index2]
*/
public int[] searchRange(int[] A, int target) {
// write your code here
if(A == null || A.length == 0) return new int[]{-1, -1};
int start = findStart(A, target);
int end = findEnd(A, target);
return new int[]{start, end}; } public int findStart(int[] A, int target) {
int start = 0;
int end = A.length - 1;
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if(A[mid] < target) {
start = mid;
} else {
end = mid;
}
}
if(A[start] == target) {
return start;
}
if(A[end] == target) {
return end;
}
return -1;
} public int findEnd(int[] A, int target) {
int start = 0;
int end = A.length - 1;
while(start + 1 < end) {
int mid = start + (end - start) / 2;
if(A[mid] <= target) {
start = mid;
} else {
end = mid;
}
}
if(A[end] == target) {
return end;
}
if(A[start] == target) {
return start;
}
return -1;
}
}
2 - Binary Search & LogN Algorithm的更多相关文章
- 2 - Binary Search & LogN Algorithm - Apr 18
38. Search a 2D Matrix II https://www.lintcode.com/problem/search-a-2d-matrix-ii/description?_from=l ...
- 将百分制转换为5分制的算法 Binary Search Tree ordered binary tree sorted binary tree Huffman Tree
1.二叉搜索树:去一个陌生的城市问路到目的地: for each node, all elements in its left subtree are less-or-equal to the nod ...
- [Algorithms] Binary Search Algorithm using TypeScript
(binary search trees) which form the basis of modern databases and immutable data structures. Binary ...
- 【437】Binary search algorithm,二分搜索算法
Complexity: O(log(n)) Ref: Binary search algorithm or 二分搜索算法 Ref: C 版本 while 循环 C Language scripts b ...
- js binary search algorithm
js binary search algorithm js 二分查找算法 二分查找, 前置条件 存储在数组中 有序排列 理想条件: 数组是递增排列,数组中的元素互不相同; 重排 & 去重 顺序 ...
- [Algorithm] Delete a node from Binary Search Tree
The solution for the problem can be divided into three cases: case 1: if the delete node is leaf nod ...
- [Algorithm] Check if a binary tree is binary search tree or not
What is Binary Search Tree (BST) A binary tree in which for each node, value of all the nodes in lef ...
- [Algorithm] Count occurrences of a number in a sorted array with duplicates using Binary Search
Let's say we are going to find out number of occurrences of a number in a sorted array using binary ...
- my understanding of (lower bound,upper bound) binary search, in C++, thanks to two post 分类: leetcode 2015-08-01 14:35 113人阅读 评论(0) 收藏
If you understand the comments below, never will you make mistakes with binary search! thanks to A s ...
随机推荐
- 命令行下执行python找不包的解决方法
首先我们来了解一下,为什么会出现这样的问题,以及python搜索包的机制是怎么样的 1.为什么会出现这样的问题? 包是向下搜索机制. 2.为什么ide中执行没有报找不到包的问题? python搜索机制 ...
- python小程序--Three(三级菜单)
#!/usr/bin/env python # _*_ coding:utf8 _*_ data = { "山东省":{ "滨州市":{"惠民县&qu ...
- Wed Sep 19 20:48:46 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection mus
Wed Sep 19 20:48:46 CST 2018 WARN: Establishing SSL connection without server's identity verificatio ...
- object tracking 词汇积累
1. off-the-shelf adj. 现成的:常备的:成品的 adv. 现成地:无需作重大修改地 commercial off-the-shelf商用现货商规成品商业货架产品供应 off-the ...
- WCF 重载
[ServiceContract] public interface IUser { [OperationContract(Name="ByUseId")] User GetUse ...
- nodejs:导出Excel和解析导入的Excel
用的是koa2框架,但好好处理一下,用express框架也是可以的.导出的Excel是xlsx的格式,解析导入Excel的有xlsx和csv格式.通常导入Excel是要上传的,然后获取文件的路径,这里 ...
- DBC文件小结
Vector的DBC文件描述了CAN网络的通信规范,通过定义signal可以表示CAN帧中的各个物理信号的含义.通过CANdb++ Editor软件可以创建和修改DBC文件,一般监控或控制CAN网络内 ...
- 第一个Python窗口
import tkinter def my_window(w, h): ws = root1.winfo_screenwidth(); hs = root1.winfo_screenheight(); ...
- Oarcle之用户管理 与 DCL
用户管理 1.创建一个账户 create user zhangsan identified by123456: 2.修改账户的密码 alter user zhangsan identified by ...
- 关于React Native中FlatList的onEndReached属性频繁调用的一种解决办法
FlatList组件是RN0.43后引入的组件.作为高性能列表组件,FlatList在ListView的基础上优化了加载性能并简化了渲染过程.不仅如此,该组件还提供了onRefresh和onEndRe ...