• 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  附上这个分析思路很不错的帖子。题目虽然不难,但也是有陷阱的

  • 相关阅读:
    FineReport---数据集
    FineReport----单元格元素(数据列、公式、斜线)
    FineReport---样式
    SQL-修改: 将日期修改为空NULL、修改为空的记录
    sql---字段类型转换,保留小数位数,取日期格式,sql获取当前时间,时间处理
    深入浅出Mqtt协议
    一文了解Redis
    RDBMS关系型数据库与HBase的对比
    Greedysky:C++ 建议用 nullptr 而不是 NULL
    Greedysky:C++11 新特性之强制类型转换static_cast
  • 原文地址:https://www.cnblogs.com/wangnanabuaa/p/4957724.html
Copyright © 2020-2023  润新知