數組查找

  1. 順序查找
    從無序數組第一個元素開始逐個元素進行比較,若某個元素與目標元素相等則查找成功,不然直至最後一個元素都不等則查找失敗。
  2. 二分查找
    在有序數組中先肯定目標元素所在的區間,而後逐步縮小查找範圍,直到找到或找不到目標元素。數組

    int binarySearch(int[] nums, int tar) {
        int low = 0, high=nums.length;
        while(low<=high) {
            int mid = low+(high-low)/2;
            if(nums[mid]==cur)     return mid;
            else if(nums[mid]>cur) high = mid - 1;
            else                   low  = mid + 1;
        }
        return -1;
    }
  3. 二分查找擴展
    1) 在一個有重複元素的數組中查找元素的最左位置。
    須要判斷返回值 low: 若該位置元素等於目標元素則 low 是最左位置,不然 low 是目標元素的插入位置。code

    int binarySearch(int[] nums, int target) {
       int low=0, high=nums.length-1;
       while(low<high) {
           int mid=low+(high-low)/2;
           if(target<=nums[mid]) high=mid;
           else                  low =mid-1;
       }
       return low;
    }

    2) 在一個有重複元素的數組中查找元素的最右位置
    須要判斷返回值 low: 若該位置元素等於目標元素則 low 是最左位置,不然 low+1 是目標元素的插入位置。get

    int binarySearchRight(int[] nums, int target) {
         int low=0, high=nums.length-1;
         while(low<high) {
             int mid=low+(high-low)/2;
             if(target>=nums[mid]) low =mid;
             else                  high=mid-1;
         }
         return low;
     }

    3) 二維數組中查找元素
    在從左到右、從上到下遞增的二維數組中查找一個元素:從右上角的元素開始比較,大於target則行+1,不然列-1擴展

    boolean find(int[][] nums, int target) {
        if(nums==null || nums.length==0 || nums[0].length==0) {
            return false;
        }
        int row=0, col=nums[0].length-1;
        while(row<nums.length && col>=0) {
            if(nums[row][col]==target) {
                return true;
            } else if(nums[row][col]<target) {
                row++;
            } else {
                col--;
            }
        }
        return false;
    }
相關文章
相關標籤/搜索