首页 > 编程语言 >[leetcode]第 5 天 查找算法(中等)

[leetcode]第 5 天 查找算法(中等)

时间:2022-12-21 13:46:57浏览次数:49  
标签:return target int flag 算法 查找 numbers leetcode matrix

04. 二维数组中的查找

思路

直接遍历!两个for循环

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        for(int[] row : matrix){
            for(int e : row){
                if(e == target) return true;
            }
        }
        return false;
    }
}

很显然不够优雅,且时间复杂度为O(NM)。。看看有没有更好的解法。。

大佬提供了标志数法。就是将矩阵旋转45°,类似于二叉搜索树,因此从根节点开始搜索,遇到比target大的元素就向左,反之向右。
以matrix左下角元素为标志数flag

  1. flag > target,则target在flag所在行上方,消去flag所在行
  2. flag < target,则target在flag所在列右方,消去flag所在列

流程:

  1. 从(i, j)开始遍历
    若matrix[i][j] > target,i--
    若matrix[i][j] < target,j++
    若matrix[i][j] = target,返回true
  2. 索引越界,返回false
    时间复杂度O(M+N)
class Solution{
  public boolean findNumberIn2DArray(int[][] matrix, int target){
    int i = matrix.length - 1, j = 0;
    while(i >= 0 && j < matrix[0].length){
       if(matrix[i][j] > target) i--;
       else if(matrix[i][j] < target) j++;
       else return true;
    }
    return false;
  }
}

11. 旋转数组的最小数字

思路

经过两小时的历练我还是选择了循环。。。

class Solution {
    public int minArray(int[] numbers) {
        int a = numbers[0];
        for(int i = numbers.length - 1 ; i >= 0; i--){
            if(a > numbers[i]) a = numbers[i];
        }
        return a;
    }
}

很明显不够优雅,评论区给了二分法的解法。
原来在旋转数组里也可以使用二分查找吗><!
流程还是三部曲:

  1. 初始化
    i, j分别指向数组的左右两端
  2. 循环二分
    m = (i + j)/2;
  3. nums[m] > nums[j],m在左子组中,旋转点x在[m + 1, j] 中, i = m + 1;
  4. nums[m] < nums[j],m在右子组中,旋转点x在[i, m - 1] 中, j = m;
  5. nums[m] = nums[j],无法判断旋转点在哪,因为可能是[2, 2, 0, 1, 2],所以j = j - 1;
  6. 返回值:i = j时跳出循环,返回nums[i]
class Solution {
    public int minArray(int[] numbers) {
        int i = 0, j = numbers.length - 1;
        while (i < j) {
            int m = (i + j) / 2;
            if (numbers[m] > numbers[j]) i = m + 1;
            else if (numbers[m] < numbers[j]) j = m;
            else j--;
        }
        return numbers[i];
    }
}

50. 第一个只出现一次的字符

思路

用hashMap存储字符和是否重复出现的标志。

class Solution {
    public char firstUniqChar(String s) {
        Map<Character, Boolean> strMap = new HashMap<>();
        char[] ch = s.toCharArray();
        for(char c : ch){
            strMap.put(c, !strMap.containsKey(c));
        }
        for(char c : ch){
            if(strMap.get(c)) return c;
        }
        return ' ';
    }
}

标签:return,target,int,flag,算法,查找,numbers,leetcode,matrix
From: https://www.cnblogs.com/vincy9501/p/16996042.html

相关文章

  • 算法导论:笔记
    AlgorithmandDataStructure目录AlgorithmandDataStructureSec6HeapSort6.1Whatisheap?6.2MaintainthePropertiesofHeap6.3BuildaHeap6.4HeapSort6.5......
  • LeetCode刷题笔记
    目录AlgorithmNote基础数组链表哈希表字符串栈与队列二叉树参考链接:代码随想录AlgorithmNote基础数组67:Sqrt-X二分查找法:x平方根的整数部分是ans是满足\(k^2......
  • [js] 树结构查找节点,深度优先
    查找节点其实就是一个遍历的过程,遍历到满足条件的节点则返回,遍历完成未找到则返回null。类似数组的find方法,传入一个函数用于判断节点是否符合条件,代码如下:functiontreeFin......
  • 每日算法之丑数
    JZ49丑数题目我们先看到题目,把只包含质因子2、3和5的数称作丑数(UglyNumber)。例如6、8都是丑数,但14不是,因为它包含质因子7。习惯上我们把1当做是第一个丑数。方法1:质......
  • JAVA常见算法
    packagecom.example.cesium.utils;publicclassdemo{/***二查分算法*半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中......
  • [算法][解析几何]覆盖最多点固定半径圆问题 POJ1981 圆的扫描线 详细解法
    引题: 覆盖最多点固定半径圆问题改编自POJ1981CircleandPoint 背景:在二维平面中给定n个点,求半径为r的圆最多可以覆盖多少个点(1<=n<=300,精度eps=0.0001)输入......
  • #yyds干货盘点# LeetCode程序员面试金典:节点间通路
    题目:节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。示例1:输入:n=3,graph=[[0,1],[0,2],[1,2],[1,2]],start=0,target=2输出:tr......
  • 如何使用Yum History查找已安装或已删除的软件包信息
    Yum是RHEL/CentOS的一个基于rpm的交互式高级包管理器,用户可以用它来安装新的软件包、卸载或清除旧的/不需要的软件包。它可以自动运行系统更新,并执行依赖分析,对已安装......
  • 图解排序算法,这五种最热门!
    介绍5种热门的排序算法,用图文+代码的方式讲解~说到排序算法,大家估计都比较熟悉,但要你一下子写出来又蒙圈了。所以这篇文章不会讲解所有的排序算......
  • 一文带你弄懂 JVM 三色标记算法!
    大家好,我是树哥。最近和一个朋友聊天,他问了我JVM的三色标记算法。我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用来......