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的更多相关文章

  1. 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 ...

  2. 将百分制转换为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 ...

  3. [Algorithms] Binary Search Algorithm using TypeScript

    (binary search trees) which form the basis of modern databases and immutable data structures. Binary ...

  4. 【437】Binary search algorithm,二分搜索算法

    Complexity: O(log(n)) Ref: Binary search algorithm or 二分搜索算法 Ref: C 版本 while 循环 C Language scripts b ...

  5. js binary search algorithm

    js binary search algorithm js 二分查找算法 二分查找, 前置条件 存储在数组中 有序排列 理想条件: 数组是递增排列,数组中的元素互不相同; 重排 & 去重 顺序 ...

  6. [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 ...

  7. [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 ...

  8. [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 ...

  9. 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 ...

随机推荐

  1. vue中上传文件之multipart/form-data

    首先在项目里用了拦截器的,由于拦截器会将传递的参数转成对象,所以你i提交的时候会发现multipart/form-data或转变成application/json 其次关于input的文件上传是需要一 ...

  2. 获取Type的三种方式

    using System;using UnityEngine; public class Type_Test : MonoBehaviour{    private void Awake()    { ...

  3. jquery判断字符长度 数字英文算1字符 汉字算2字符

    <input type="text" maxlength="25" oninput="textlength(this)"> &l ...

  4. js选中变色,不选中鼠标放上变色

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  5. PPTP支持IPv6

    pptp支持ipv6,谷歌资料不多,这里整理下   主要用来给ipv4访问ipv6资源的场景使用,客户端连接上pptp后会分配得到一个ipv6地址,通过此地址访问ipv6的资源 客户端网段在pptp. ...

  6. 【错误总结1:unity StartCoroutine 报 NullReferenceException 错误】

    今天在一个项目中,写了一个单例的全局类,该类的作用是使用协程加载场景.但在StartCoroutine 这一步报了NullReferenceException 的错.仔细分析和搜索之后,得到错误原因. ...

  7. hdu4780 最小费用最大流

    提交 题意: 给了M个机器,N个糖果要被生产,每个糖果有一个Si和Ti的时间,只能在Si或者在Si<=t<Ti的时间开始生产 每个机器进行转化生产产品的时候都会产生一个代价,然后求最小的代 ...

  8. hdu4779 组合计数+dp

    提交 题意:给了n*m的网格,然后有p个重型的防御塔,能承受1次攻击,q个轻型防御塔不能接受任何攻击,然后每个防御搭会攻击他所在的行和所在的列,最后求在这个网格上放至少一个防御塔的方案数, 我们枚举 ...

  9. 20175208《Java程序设计》第五周学习总结

    教材学习内容总结 1.接口:1)接口声明: interface //接口的名字 2)接口体2.实现接口:类实现接口:一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口.如果实 ...

  10. 刷Python核心编程第三版的习题时遇到一个findall的坑

    在用正则表达式做以下查找时,发现re.findall()对于正则表达式有没有圆括号是有区分的,具体如下 line = 'Tue Sep 18 12:48:21 2029::ilziuv@zcntzir ...