• 【每日一题】34. 在排序数组中查找元素的第一个和最后一个位置


    34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

    如果数组中不存在目标值 target,返回 [-1, -1]

    你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

    示例 1:

    输入:nums = [5,7,7,8,8,10], target = 8
    输出:[3,4]

    示例 2:

    输入:nums = [5,7,7,8,8,10], target = 6
    输出:[-1,-1]

    示例 3:

    输入:nums = [], target = 0
    输出:[-1,-1]

    提示:

    • 0 <= nums.length <= 105
    • -109 <= nums[i] <= 109
    • nums 是一个非递减数组
    • -109 <= target <= 109

     

    1. class Solution {
    2. public int[] searchRange(int[] nums, int target) {
    3. int left = 0;
    4. int len = nums.length;
    5. int right = len-1;
    6. int mid = 0;
    7. int[] arr = new int[2];
    8. arr[0]=arr[1]=-1;
    9. if(len == 0) return arr;
    10. while(left < right) {
    11. mid = (left + right) / 2;
    12. if(nums[mid] < target) {
    13. left = mid;
    14. } else if(nums[mid] == target) {
    15. right = mid;
    16. } else {
    17. right = mid;
    18. }
    19. if(right - left == 1) break;
    20. }
    21. if(nums[left] == target) arr[0] = arr[1] = left;
    22. else if(nums[right] == target) arr[0] = arr[1] = right;
    23. left = 0;
    24. right = len-1;
    25. while(left < right) {
    26. mid = (left + right) / 2;
    27. if(nums[mid] < target) {
    28. left = mid;
    29. } else if(nums[mid] == target) {
    30. left = mid;
    31. } else {
    32. right = mid;
    33. }
    34. if(right - left == 1) break;
    35. }
    36. if(nums[right] == target) {
    37. arr[1] = right;
    38. if(arr[0] == -1) arr[0] = right;
    39. }
    40. else if(nums[left] == target) {
    41. arr[1] = left;
    42. if(arr[0] == -1) arr[0] = left;
    43. }
    44. return arr;
    45. }
    46. }

            每日一题,今天是中等题。今天仍然是和二分相关的题目,还是边界的判断问题。

            看完题目,要求我们使用O(log(n))的算法。O(log(n))算法,递增数组,查找下标,就是二分查找算法了。但是,之前也说过,题目明显的二分查找算法,肯定会对各种边界有所要求。这道题目要求我们找出目标在数组中最开始和最后面的下标。可以使用二分,但一次二分显然是不够的。如果一整个数组全都是目标数呢?很显然二分一次只能往左找最靠近左边的,第二次往右找最靠近右边的。之后对找到的下标进行边界的判断。如果最左边找到的和目标数相等,那么要么就是只有那个数,要么就是右边还有一个。第二次找右边的也一样,如果第一次的时候左边没找到,说明可能只有右边一个数,或者右边的左边一个数也是。

            纯二分就做好边界判断,多练习。

  • 相关阅读:
    内存管理篇——线性地址的管理
    JAVA基础——反射机制
    【计算机毕业设计】网上游戏代练商城系统
    8Manage PM:通过项目管理信息系统做好进度管控
    《白皮书》:人脸识别系统的组成及面临的安全风险
    FFmpeg调用avformat_open_input时返回错误 -22(Invalid argument)
    linux内核源码分析之物理内存
    java计算机毕业设计高校后勤保修系统MyBatis+系统+LW文档+源码+调试部署
    springboot海纳部门人事管理系统毕业设计源码
    水质分析仪MQTT应用案例
  • 原文地址:https://blog.csdn.net/C_Ryson/article/details/132912660