• leetcode 34. 在排序数组中查找元素的第一个和最后一个位置


    给你一个按照非递减顺序排列的整数数组 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. int Binary_Search(int *nums, int left, int right, int target, int flag){
    2. int ans = -1, rr = right;
    3. int mid ;
    4. while(left < right){
    5. mid = (left + right) / 2;
    6. if(nums[mid] == target)
    7. ans = mid;
    8. if(flag){//找右边界
    9. if(nums[right] == target)
    10. ans = right;
    11. //尽量不移动右边界
    12. if(nums[mid] > target)
    13. right = mid - 1;
    14. else
    15. left = mid + 1;
    16. }else{//找左边界,尽量不移动左边界
    17. if(nums[left] == target)
    18. ans = left;
    19. if(nums[mid] < target)
    20. left = mid + 1;
    21. else
    22. right = mid - 1;
    23. }
    24. }
    25. //加这个是为了防止下面的判断会非法访问内存,如访问nums[-1]和nums[numsSize]
    26. if(left < 0 || right < 0 || left > rr || right > rr )
    27. return ans;
    28. //防止left == right时是我们所求的边界
    29. if(nums[right] == target && flag)
    30. ans = right;
    31. else if(nums[left] == target)
    32. ans = left;
    33. return ans;
    34. }
    35. int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    36. *returnSize = 2;
    37. int *ans = malloc(sizeof(int) * 2);
    38. ans[0] = ans[1] = -1;
    39. if(numsSize == 0)//剔除nums为空
    40. return ans;
    41. //找左边界
    42. ans[0] = Binary_Search(nums, 0, numsSize -1, target, 0);
    43. //找右边界
    44. ans[1] = Binary_Search(nums, 0, numsSize -1, target, 1);
    45. return ans;
    46. }

     

  • 相关阅读:
    Docker学习(一)
    软件开发平台流辰信息如何为客户分忧解难?
    解决Jenkins执行git脚本时报错:No such device or address问题
    基于SSM的“鲜花”电子商务平台设计与实现
    C语言strcat函数再学习
    这俩工具,好用到绝绝子
    面试必问:Redis 如何实现库存扣减操作?
    Spring整合Mybatis,SqlSessionTemplate方式
    MySQL数据库——17.正则表达式
    Blood and Bone
  • 原文地址:https://blog.csdn.net/qq_41555003/article/details/127434900