题目:5071. 找出所有行中最小公共元素

给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了。请你帮忙找出在所有这些行中 最小的公共元素

如果矩阵中没有这样的公共元素,就请返回 -1

示例:

输入:mat = [[1,2,3,4,5],[2,4,5,8,10],[3,5,7,9,11],[1,3,5,7,9]]

输出:5

提示:
  • 1 <= mat.length, mat[i].length <= 500
  • 1 <= mat[i][j] <= 10^4
  • mat[i] 已按递增顺序排列。
题解

感觉这题比第二题简单多了。不明白为什么要分数一样。

定义一个一维数组表示每行可能是最小公共元素的列下标。然后比较每行的列下标所指的数的是否相等,如果全都相等,说明它就是最小公共元素。

那下标的改变是靠什么呢?

pos[j] 表示第 j 行的当前下标。

如果指向的数比第 0 行的当前数小,那么它就要加 1,即向后移动。

如果大于,那么说明第 j 行不存在和第 0 行第 i 个数相等的数。即第 i 个数不是最小公共元素。

如果相等就检查下一行。直到所有行都满足条件。

时间复杂度: 双层循环 O(n2)O(n^{2})O(n2)

空间复杂度: 一维数组和 mat 的行数有关,O(n)O(n)O(n)

Java
class Solution {
public int smallestCommonElement(int[][] mat) {
int m = mat.length;
int n = mat[0].length;
int[] pos = new int[m];// 保存每行的可能的最小公共元素的列下标
// 遍历第0行的n个数
for (int i = 0; i < n; ++i) {
boolean flag = true;// 第0行的第i个数(简:数x)是最小的公共元素
// 遍历第1~n行,检查第0行的第i个数是否在第j行中
for (int j = 1; j < m; ++j) {
// 第j行的数小,那么下标pos[j]后移
while (mat[j][pos[j]] < mat[0][i]) {
if (++pos[j] >= n) {// 第j行已经遍历完,都不存在数x
return -1;// 直接返回未找到,即-1
}
}
// 第j行的第pos[j]个数大于数x,那么数x不满足条件
if (mat[j][pos[j]] > mat[0][i]) {
flag = false;// 设为不是
break;// 退出
}
}
if (flag == true) {
return mat[0][i];// 是最小公共元素,返回它
}
}
return -1;// 没找到
}
}

LeetCode 5071. 找出所有行中最小公共元素(Java)的更多相关文章

  1. leetcode 双周赛9 找出所有行中最小公共元素

    给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...

  2. 找出数字数组中最大的元素(使用Math.max函数)

    从汤姆大叔的博客里看到了6个基础题目:本篇是第1题 - 找出数字数组中最大的元素(使用Match.max函数) 从要求上来看,不能将数组sort.不能遍历.只能使用Math.max,所以只能从java ...

  3. 寻找两个数组中的公共元素Java程序代码

    package lianxi; import java.util.*; public class UnionSearch { public static void main(String[] args ...

  4. 找出一堆数中最小的前K个数

    描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...

  5. 【LeetCode】找出所有数组中消失的数字

    [问题] 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次.找到所有在 [1, n] 范围之间没有出现在数组中的数字. ...

  6. python -- 对list去重并找出列表list中的重复元素

    一.一个列表中可能含有重复元素,使用set()可以实现列表的去重处理,但是无法知道哪些元素是重复的,下面的函数用于找出哪些元素重复了,以及重复的次数. 代码: from collections imp ...

  7. 找出N个数中最小的k个数问题(复杂度O(N*logk))

    这是一个经典的算法题,下面给出的算法都在给定的数组基础上进行,好处时不用分配新的空间,坏处是会破坏原有的数组,可以自己分配新的空间以避免对原有数组的破坏. 思路一 先直接排序,再取排序后数据的前k个数 ...

  8. 找出如下数组中最大的元素和最小的元素, a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}

    int [][]a={{3,2,6},{6,8,2,10},{5},{12,3,23}}; //先对二维数组进行遍历:然后把二维数组合成一个数组 int[] k=new int[11]; int q= ...

  9. 15.找出如下数组中最大的元素和最小的元素, a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}

    package com.bao; public class Erweim { public static void main(String[] args) { int[][]a={{3,2,6},{6 ...

随机推荐

  1. ava 类似jest snapshot 功能试用

    ava也提供了类似jest 的snapshot 测试,可以用来方便的测试web 组件,以下是一个简单的试用, 同时包含了自己碰到问题,以及解决方法,以及一些参考链接 使用typescript 以及ts ...

  2. [RN] React Native 实现 类似京东 的 沉浸式状态栏和搜索栏

    React Native 实现 类似京东 的 沉浸式状态栏和搜索栏 其原理其实就是在要 隐藏 部分的那个View 前面加入 StatusBar 代码! 代码如下: <StatusBar anim ...

  3. NOI2019 回家路线 DP

    「NOI2019」回家路线 链接 loj 思路 f[i][j]第i个点,时间为j,暴力转移 复杂度O(m*t),好像正解是斜率优化,出题人太不小心了233 代码 #include <bits/s ...

  4. cogs 920. [東方S1] 琪露诺

    二次联通门 : cogs 920. [東方S1] 琪露诺 /* cogs 920. [東方S1] 琪露诺 dp 方程为dp[i] = max (dp[i - L], dp[i - L + 1] ... ...

  5. centos7 安装 bugfree3

    . 安装apache yum install httpd . 安装mysql wget -i -c http://dev.mysql.com/get/mysql57-community-release ...

  6. Mongoose 索引

    Mongoose 索引介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更 快(如果有些字段是用不着的就不要设置索引).MongoDB 的索引几乎与传统的关系型数据库一 ...

  7. pdf 中画虚线

    <?php require('fpdf.php'); class PDF_Dash extends FPDF { function SetDash($black=null, $white=nul ...

  8. 使用visual studio code运行html

    可以安装插件:open in browser 安装好插件后,编辑html网页的时候,右键多了两个菜单: 1.Open in Default Browser 2.Open in Other Browse ...

  9. Keras split train test set when using ImageDataGenerator

    Keras split train test set when using ImageDataGenerator I have a single directory which contains su ...

  10. Java基础 awt Graphics2D 生成矩形图片并向其中画一条直线

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...