• o1-check-power-of-2 && search-a-2d-matrix


    用 O(1) 时间检测整数 n 是否是 2 的幂次。

    样例

    n=4,返回 true;

    n=5,返回 false.

    注意

    O(1) 时间复杂度

     1 class Solution {
     2     /*
     3      * @param n: An integer
     4      * @return: True or false
     5      */
     6     public boolean checkPowerOf2(int n) {
     7         // write your code here
     8         if(n==1){
     9             return true;
    10         }else if(n<=0||n%2==1){
    11             return false;
    12         }else{
    13             while(n>1){
    14                 n=n/2;
    15                 if(n==1) return true;
    16                 if(n%2==1) return false;
    17             }
    18         }
    19         return true;
    20     }
    21 };

    写出一个高效的算法来搜索 m × n矩阵中的值。

    这个矩阵具有以下特性:

    • 每行中的整数从左到右是排序的。
    • 每行的第一个数大于上一行的最后一个整数

    考虑下列矩阵:

    [
      [1, 3, 5, 7],
      [10, 11, 16, 20],
      [23, 30, 34, 50]
    ]
    

    给出 target = 3,返回 true

    我使用的是二分法,最传统的查找,当然也过了,不过在学习过程中发现了别人更好的代码

     1 public class Solution {
     2     /**
     3      * @param matrix, a list of lists of integers
     4      * @param target, an integer
     5      * @return a boolean, indicate whether matrix contains target
     6      */
     7     public boolean searchMatrix(int[][] matrix, int target) {
     8         // write your code here
     9         int left = 0;
    10         int right = matrix.length-1;
    11         if(left!=right){
    12             while(left<=right){
    13               int  middle=(right+left)/2;
    14               if(matrix[middle][0]<target){
    15                   left = middle +1;
    16               }else if(matrix[middle][0]>target){
    17                   right = middle -1;
    18               }else {
    19                   return true;
    20               }
    21             }
    22             
    23         }
    24         if(right < 0 ){
    25             return false;
    26         }
    27         else{ 
    28             int row = right;
    29             left = 0;
    30             right = matrix[row].length -1;
    31             if(left!=right){
    32               while(left<=right){
    33                  int  middle=(right+left)/2;
    34                  if(matrix[row][middle]<target){
    35                        left = middle +1;
    36                  }else if(matrix[row] [middle]>target){
    37                       right = middle -1;
    38                  }else {
    39                      return true;
    40                   }
    41                 }
    42             }
    43         
    44         }
    45        return false;
    46    }
    47 }
     1 public class Solution {
     2     /**
     3      * @param matrix, a list of lists of integers
     4      * @param target, an integer
     5      * @return a boolean, indicate whether matrix contains target
     6      */
     7     public boolean searchMatrix(int[][] matrix, int target) {
     8         // write your code here
     9         int i=0;
    10         int j=matrix[0].length -1;
    11         while (i <matrix.lenght&&j>=0){
    12         if(matrix[i][j]==target){
    13            return true;
    14         }else if (target < matrix[i][j]){
    15             j--;
    16         }else {
    17             i++;
    18         }
    19        return  false20    }
    21 }

    http://www.leetcode.com/2010/10/searching-2d-sorted-matrix.html  附上这个分析思路很不错的帖子。题目虽然不难,但也是有陷阱的

  • 相关阅读:
    硬币游戏 Project Euler 232
    屏幕空间的近似全局光照明(Approximative Global Illumination in Screen Space)
    四维之美
    vertex texture fetching in HLSL, and heightfield normal calculation
    一个VS小插件(跳出括号)
    我的算法书籍收藏
    Algorithms.算法概论.习题答案
    UML用例图教程详解
    大连理工大学软件学院博客地址
    快递查询API,我推荐“爱快递”
  • 原文地址:https://www.cnblogs.com/wangnanabuaa/p/4957724.html
Copyright © 2020-2023  润新知