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
- leetcode二分排序 & 查找:
- leetcode--二分查找和二分排序
- LeetCode基础-查找-排序数组二分查找
- 【leetcode】在旋转排序数组中查找(二分)
- 【leetcode】有重复的旋转排序数组查找(二分)
- 二分排序与二分查找
- 二分排序与二分查找
- 二分排序与二分查找
- 二分查找和二分排序
- leetcode 二分查找系列
- LeetCode二分查找总结
- LeetCode专题: 二分查找
- Leetcode二分查找算法
- 二分查找折半查找排序
- 冒泡排序+二分查找
- 冒泡排序、二分查找
- 排序算法-二分查找
- 二分查找插入排序
- React Native嵌入Android原生项目中
- InputStream对象的重复使用
- 根据进程名称杀死多个进程
- TCP三次握手四次挥手详解
- java Android OKHttp HTTPS 请求证书验证 PEM证书(1)
- leetcode二分排序 & 查找:
- spring 集成cxf 封装的webserice
- postgresql无法启动,日志报错:make sure postgresql is not already running
- 第十三周项目二(Kruskal算法的验证)
- bitbake的原理介绍, 使用方法, 编译脚本的编写方法
- Android项目配置
- DataTable类Clone及Copy方法的区别
- VMProtect 与 ASProtect 在VC中的SDK编程
- 学习Linux 比较实用的命令