首页 > 其他分享 >LeetCodeHot100 二分查找 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 33. 搜索旋转排序数组 153. 寻找旋转排序数组中

LeetCodeHot100 二分查找 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 33. 搜索旋转排序数组 153. 寻找旋转排序数组中

时间:2024-03-22 10:15:42浏览次数:30  
标签:index right target nums int 搜索 数组 排序 left

35. 搜索插入位置
https://leetcode.cn/problems/search-insert-position/description/?envType=study-plan-v2&envId=top-100-liked

public int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right){
            int index = left + ((right - left) >> 1);
            if (nums[index] == target){
                return index;
            }else if (target > nums[index]){
                left = index + 1;
            }else {
                right = index - 1;
            }
        }
        return left;
    }

74. 搜索二维矩阵
https://leetcode.cn/problems/search-a-2d-matrix/description/?envType=study-plan-v2&envId=top-100-liked

public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length - 1;
        int n = matrix[0].length - 1;
        int i = 0;
        int j = n;
        while (i <= m && j >= 0){
            if (matrix[i][j] == target){
                return true;
            }else if (target > matrix[i][j]){
                i++;
            }else {
                j--;
            }
        }
        return false;
    }

总结:从右上角开始二分查找
34. 在排序数组中查找元素的第一个和最后一个位置
https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/?envType=study-plan-v2&envId=top-100-liked

public int[] searchRange(int[] nums, int target) {
        int i = 0;
        int j = nums.length - 1;
        int left = -1,right = -1;
        while (i <= j){
            int index = i + ((j - i) >> 1);
            if (target == nums[index]){
                left = index;
                while (left > 0 && nums[left - 1] == target){
                    left--;
                }
                right = index;
                while (right < nums.length - 1 && nums[right + 1] == target) {
                    right++;
                }
                break;
            }else if (target < nums[index]){
                j = index - 1;
            }else {
                i = index + 1;
            }
        }
        return new int[]{left,right};
    }

总结:二分查找,找到一个再扩散左右
33. 搜索旋转排序数组
https://leetcode.cn/problems/search-in-rotated-sorted-array/description/?envType=study-plan-v2&envId=top-100-liked

public int search(int[] nums, int target) {
        int p = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i - 1] > nums[i]) {
                p = i;
                break;
            }
        }
        int left = 0;
        int right = p - 1;
        if (target <= nums[nums.length - 1]){
            left = p;
            right = nums.length - 1;
        }
        while (left <= right){
            int index = left + ((right - left) >> 1);
            if (target == nums[index]){
                return index;
            }else if (target < nums[index]){
                right = index - 1;
            }else {
                left = index + 1;
            }
        }
        return -1;
    }

总结:先找到这个旋转点p,再看从左侧二分查找,还是从右侧二分查找
153. 寻找旋转排序数组中的最小值
https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/description/?envType=study-plan-v2&envId=top-100-liked

public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while (left < right){
            int index = left + ((right - left) >> 1);
            if (nums[index] > nums[right]){
                left = index + 1;
            }else {
                right = index;
            }
        }
        return nums[left];
    }

总结:其实就是两个上升的序列,若index的值>right的值说明,min一定不在index以及index左侧,若index的值<right的值,说明min有可能是index以及index左侧,一定不是index右侧

标签:index,right,target,nums,int,搜索,数组,排序,left
From: https://www.cnblogs.com/jeasonGo/p/18088802

相关文章

  • (41/60)0-1背包(二维数组、一维数组)、分割等和子集
    有点抽象0-1背包卡码网:携带研究材料(第六期模拟笔试)动态规划思路二维:意义:0~i物品内,放进容量为j的背包,最大价值为dp[i][j]递推:dp[i][j]=max(dp[i-1][j-weight[i],dp[i-1][j])初始化:第一列为0,第一行j>=weight[0]时赋值为value[0]遍历:先背包再物品/先物品再背包均可(......
  • 循环控制:(第10题)与闰年相关的问题,涉及数组,函数的知识
    #include<stdio.h>intis_leap_year(intyear){ if((year%4==0&&year%100!=0)||year%400==0) return1; else return0;}intgap_years(intyear){ inti=1990; intsum=0; intgap_years=0; if(year==1990) retur......
  • 非有序数组也能二分? —— 红蓝染色法续篇(Leetcode 162.寻找峰值)
    1.写在前面本文为个人学习总结,参考:B站Up:灵茶山艾府参考视频链接:https://www.bilibili.com/video/BV1QK411d76w/2.题目我们来看一下下面这道题:峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在......
  • 冒泡排序和选择排序--C语言
    冒泡排序(升序):设计思想:每两个相邻的数进行比较,大的往后走详细过程:例:99,100,88,80,100,90,77,22,33,90第一遍:99与100比较,100大,继续向后走,100与88比较,100大,100与88交换一下位置,继续向后走100与80比较,100大,100与80交换一下位置,继续向后走100与100比较,相等,不需要......
  • 记忆化搜索 —— Leetcode 2684. 矩阵中移动的最大次数
    题目如下:给你一个下标从 0 开始、大小为 mxn 的矩阵 grid ,矩阵由若干 正 整数组成。你可以从矩阵第一列中的 任一 单元格出发,按以下方式遍历 grid :从单元格 (row,col) 可以移动到 (row-1,col+1)、(row,col+1) 和 (row+1,col+1) 三个单元......
  • vscode --- 设置文件显示和搜索过滤
    打开setting.json {"search.exclude":{"**/node_modules":true,"**/bower_components":true,"dist/":true,"build/":true,"temp/":true,......
  • 450. 删除二叉搜索树中的节点c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*leftleave(structTreeNode*root){if(root->left){root=root->left;......
  • 合并两个排序的链表
    合并两个排序的列表题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。数据范围链表长度[0,500][0,500]。样例输入:1->3->5,2->4->5输出:1->2->3->4->5->5代码实现迭代版本structListNode{intval;ListNode*nex......
  • 前端基础之JavaScript数组
    数组一、什么是数组数组类似于python里面的列表[]在编程中,数组(Array)是一种数据结构,用于存储相同类型的多个元素。这些元素按照顺序排列,并通过索引(通常是非负整数)来访问。数组可以包含各种数据类型,例如整数、浮点数、字符串,甚至其他数组。在许多编程语言中,数组的大小是固定......
  • JavaScript 实现通过 id 数组获取可展示的 name 拼接字符串
    JavaScript实现通过id数组获取可展示的name拼接字符串场景有一个包含许多对象的数组,每个对象都包含了一个标识(id)和一个名称(name)。想要从这个数组中选出特定的一些对象,这些对象的标识(id)在另一个数组中已经给出。然后,想把这些选出来的对象的名称(name)连接成一个字符串,用逗号分......