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 ...
随机推荐
- 打包工具webpack安装·Mac
最近在学Vue.js,是我接触的第一个前端框架.本来感觉还不错,各种惊叹于它可以用很少的代码写出那种具备交互能力的神奇模块. 在学的过程中总是能碰到一个叫webpack的单词,查过,是一个模块打包器, ...
- SQL的优化整理
1,对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建索引 (注意:如果一张数据表中的数据更新频率太高,更新数据之后需要重新创索引,这个过程很耗费性能,所以更新频率高的数据表慎用 ...
- C#6.0,C#7.0新特性
C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto-Property Initia ...
- 18.12.09-C语言练习:兔子繁衍问题 / Fibonacci 数列
题目: 问题解析: 这是典型的/Fibonacci 数列问题.具体这里不赘述. 问题中不论是初始的第1对兔子还是以后出生的小兔子都是从第3个月龄起每个月各生一对兔子. 设n1,n2,n3分别是每个月1 ...
- CentOS7中OpenVPN的配置
最近需要在openstack中集成openvpn功能,故熟悉了一下openvpn的搭建流程,记录下来,供参考 版本:openvpn-2.3.4.tar.gz 下载地址:http://pan.baidu ...
- Delphi中PointerMath指令
Type Switch Syntax {$POINTERMATH ON} or {$POINTERMATH OFF} Default {$POINTERMATH OFF} Sc ...
- vuex 入坑篇
Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 这个状态自管理应用包含 ...
- PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题 (20 分)
题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808 #include <iost ...
- Spring 极速集成注解 redis 实践
Redis 做为基于内存的 Key-Value 数据库,用来做缓存服务器性价比相当高. 官方推出的面向 Java 的 Client Jedis,提供了很多接口和方法,可以让 Java 操作使用 Red ...
- Linux命令-cut篇
Cut 命令是常用的 Linux 命令,在这里总结一下平时常用的参数和用法,方便查证. 常用参数: -b:以字节为单位进行分割: -c:以字符为单位进行分割: -d:自定义分割符进行分割,默认为制表符 ...