• LeetCode-热题100-笔记-day32


    二分查找

    今日刷到二分查找,以前做过的题忘的一干二净;庆幸自己用新的方法做了出来两道“中等”题;(我都能做出来我认为应该标“简单”)由于之前题的难度基本在抄答案,所以停更几天。今天没抄答案就更新一下。

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

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

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

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

    示例 1:

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

    算法思路

    “ 间复杂度为 O(log n) ,按照非递减顺序排列的整数数组 nums”两个提示说明要用到二分查找才能满足题目要求,直接写出二分查找基本函数biSearch(int[] nums, int target),并在主函数调用;若在nums中找到target,则返回target的索引mid,否则返回-1;若返回-1就表示没找到,则返回[-1,-1];由于是非递数组,若有多个target值应该是连续存在,故从mid向两侧开始寻找,返回[indexl,indexr]即可;+1,-1是因为while跳出循环前多+/-一次;

    1. class Solution {
    2. public int[] searchRange(int[] nums, int target) {
    3. int left=0,right=nums.length-1;
    4. int temp=biSearch(nums,target);
    5. if(temp>=0){
    6. int indexr=temp, indexl=temp;
    7. while(indexr<=right&&nums[indexr]==nums[temp]){
    8. indexr++;
    9. }
    10. while(indexl>=0&&nums[indexl]==nums[temp]){
    11. indexl--;
    12. }
    13. return new int[]{indexl+1,indexr-1};
    14. }
    15. return new int[]{-1,-1};
    16. }
    17. public int biSearch(int[] nums, int target) {
    18. int left=0,right=nums.length-1;
    19. while(left<=right){
    20. int mid=(right-left)/2+left;
    21. if(nums[mid]==target){
    22. return mid;
    23. }
    24. if(nums[mid]>target){
    25. right=mid-1;
    26. }else{
    27. left=mid+1;
    28. }
    29. }
    30. return -1;
    31. }
    32. }

    结果

    74.搜索二维矩阵 

    给你一个满足下述两条属性的 m x n 整数矩阵:

    • 每行中的整数从左到右按非递减顺序排列。
    • 每行的第一个整数大于前一行的最后一个整数。

    给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

    示例 1:

    输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
    输出:true

    算法思路

    “非递减”直接使用效率最高的二分查找;每行循环一次进行一次二分查找找到为止;

    1. class Solution {
    2. public boolean searchMatrix(int[][] matrix, int target) {
    3. for(int[] num:matrix){
    4. if(biSearch(num,target)==true){
    5. return true;
    6. }
    7. }
    8. return false;
    9. }
    10. public boolean biSearch(int[] nums, int target){
    11. int left=0, right=nums.length-1;
    12. while(left<=right){
    13. int mid=(right-left)/2+left;
    14. if(nums[mid]==target){
    15. return true;
    16. }
    17. if(nums[mid]>target){
    18. right=mid-1;
    19. }else{
    20. left=mid+1;
    21. }
    22. }
    23. return false;
    24. }
    25. }

     结果


     

  • 相关阅读:
    20220807 leetcodez周赛
    JavaScript-HTML DOM改变HTML
    基于HPC场景的集群管理系统(slurm系统初相识)
    DeepExploit——基于强化学习的自动渗透工具
    Podman 部署私有镜像仓库
    离线安装 K3S
    Java从零学起(十二)----HashSet集合
    说说你对工厂模式的理解?应用场景?
    华为云云耀云服务器L实例评测|认识redis未授权访问漏洞 & 漏洞的部分复现 & 设置连接密码 & redis其他命令学习
    【C++】进阶模板
  • 原文地址:https://blog.csdn.net/This_is_/article/details/133321265