leetcode二分排序 & 查找:

来源:互联网 发布:木材砍伐数据 编辑:程序博客网 时间:2024/06/06 04:42

2、Search for a Range
链接:http://oj.leetcode.com/problems/search-for-a-range/

思路:二分法查找

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

3、Sqrt(x)
链接:http://oj.leetcode.com/problems/sqrtx/

思路:二分法求解,初始状态,注意溢出

public int mySqrt(int x) {        if(x <= 1)            return x;        int low = 1, high = x/2, mid = 0;        long temp;        while(low <= high){            mid = low + (high - low)/2;            temp = (long)mid * mid;            if(temp > x){                high = mid - 1;            }else if(temp < x){                low = mid + 1;            }else return mid;        }        while((long)mid * mid > x){            mid--;        }        return mid;    }
public int mySqrt(int x) {        if(x <= 1)            return x;        int low = 1, high = x/2, mid = 0;        while(low <= high){            mid = low + (high - low)/2;            if(mid  > x/mid){                high = mid - 1;            }else if(mid  < x/mid){                low = mid + 1;            }else return mid;        }        while((long)mid * mid > x){            mid--;        }        return mid;    }

4、Search Insert Position
链接:http://oj.leetcode.com/problems/search-insert-position/

思路:二分查找,注意一种情况,数组中没有target,需要考虑插入最后high==low 的前边还是后面

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

5、Search in Rotated Sorted Array
链接:http://oj.leetcode.com/problems/search-in-rotated-sorted-array/

思路:先寻找翻转的节点,分为两部分,进行二分查找

public int search(int[] nums, int target) {        int len = nums.length - 1, i,low, high, mid, flag = 0;        for(i = 0; i < len; i++){            if(nums[i] > nums[i+1]){                flag = 1;                break;            }        }        if(flag == 1 && (nums[i+1] > target || nums[i] < target) || flag == 0 && (nums[0]> target || nums[len] < target))            return -1;        if(flag == 0){            low = 0;            high = len;        }else if(nums[0] <= target && nums[i] >= target){            low = 0;            high = i;        }else {            low = i+1;            high = len;        }        while(low <= high){            mid = (low + high)/2;            if(nums[mid] == target)                return mid;            if(nums[mid] > target){                high = mid - 1;            }else{                low = mid + 1;            }        }        return -1;    }

6、Search in Rotated Sorted Array II
链接:http://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/
思路:考虑重复情况,移动节点

public boolean search(int[] nums, int target) {        int len = nums.length - 1, i,low, high, mid, flag = 0;        for(i = 0; i < len; i++){            if(nums[i] > nums[i+1]){                flag = 1;                break;            }        }        if(flag == 1 && (nums[i+1] > target || nums[i] < target) || flag == 0 && (nums[0]> target || nums[len] < target))            return false;        if(flag == 0){            low = 0;            high = len;        }else if(nums[0] <= target && nums[i] >= target){            low = 0;            high = i;        }else {            low = i+1;            high = len;        }        while(low < high && nums[low] == nums[low + 1]){            low++;        }        while(high > low && nums[high] == nums[high - 1]){            high--;        }        while(low <= high){            mid = (low + high)/2;            if(nums[mid] == target)                return true;            if(nums[mid] > target){                high = mid - 1;                while(high > low && nums[high] == nums[high - 1]){                    high--;                }            }else{                while(low < high && nums[low] == nums[low + 1]){                    low++;                }                low = mid + 1;            }        }        return false;    }
1 0
原创粉丝点击