LeetCode 5071. 找出所有行中最小公共元素(Java)

Stella981
• 阅读 520

题目: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;// 没找到
    }
}
点赞
收藏
评论区
推荐文章
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
LeetCode 58. 最后一个单词的长度 (java)
题目:https://leetcodecn.com/problems/lengthoflastword/submissions/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fleetcodecn.com%2Fproblems%2Flengthoflastw
Stella981 Stella981
3年前
LeetCode 5073. 进击的骑士(Java)BFS
题目:5073\.进击的骑士(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fleetcodecn.com%2Fcontest%2Fbiweeklycontest9%2Fproblems%2Fminimumknightmoves%2F)一个坐标可以从i
Stella981 Stella981
3年前
LeetCode——295. Find Median from Data Stream
一.题目链接:  https://leetcode.com/problems/findmedianfromdatastream(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fleetcode.com%2Fproblems%2Ffindmedianfromdatast
Wesley13 Wesley13
3年前
11款相似图片搜索引擎推荐,以图搜图将不再是难事
\转载自yclzh0522(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmy.csdn.net%2Fyclzh0522)的博客你想凭着一张现有图片找出它的原始图片,或者是凭着一张小的缩略图找出原始
Stella981 Stella981
3年前
Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解
题目链接https://leetcodecn.com/problems/slidingwindowmaximum/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fleetcodecn.com%2Fproblems%2Fslidingwindowmaximum%
Stella981 Stella981
3年前
LeetCode 39. Combination Sum
问题链接LeetCode39.CombinationSum(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fleetcode.com%2Fproblems%2Fcombinationsum%2Fdescription%2F)题目解析给一组数和一个目
Wesley13 Wesley13
3年前
Codevs 1159最大全0子矩阵
题目描述Description在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多。输入描述InputDescription输入文件第一行为整数N,其中1<N<2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开。输出描述OutputDescription
Stella981 Stella981
3年前
JavaScript基础知识
题目:1.找出数字数组中最大的元素(使用Math.max函数)2.转化一个数字数组为function数组(每个function都弹出相应的数字)3.给object数组进行排序(排序条件是每个元素对象的属性个数)4.利用JavaScript打印出Fibonacci数(不使用全局变量)5.实现如下语法的功能:vara(5).plus(
Stella981 Stella981
3年前
925. Long Pressed Name
题目链接:https://leetcode.com/problems/longpressedname/description/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fleetcode.com%2Fproblems%2Flongpressedname%2Fdescript