文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 按列遍历
    • 2.2 二分查找
    • 2.3 合并k个有序链表

1. 题目

给你一个矩阵 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] 已按递增顺序排列。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-smallest-common-element-in-all-rows
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 按列遍历

  • 按列遍历,计数,最先达到行数的就是答案
class Solution {public:int smallestCommonElement(vector<vector<int>>& mat) {int m = mat.size(), n = mat[0].size();int count[10001] = {0};for(int j = 0, i; j < n; ++j){for(i = 0; i < m; ++i){if(++count[mat[i][j]] == m)return mat[i][j];}}return -1;}
};

180 ms 24.2 MB

2.2 二分查找

  • 依次对第一行的每个元素在其他行进行二分查找,都找到了,就是答案

代码略

2.3 合并k个有序链表

类似的思想

class Solution {public:int smallestCommonElement(vector<vector<int>>& mat) {int m = mat.size(), n = mat[0].size(), i = 0, cur = mat[0][0], count = 1;vector<int> idx(m,0);//每行遍历到的位置while(1){i = (i+1)%m;//循环遍历每行while(idx[i] < n && mat[i][idx[i]] < cur)idx[i]++;//找curif(idx[i] >= n)//找完了,没找到return -1;else if(mat[i][idx[i]]==cur){  //找到了count++;idx[i]++;}else if(mat[i][idx[i]] > cur){    //没找到,那就以当前数,重新找cur = mat[i][idx[i]];count = 1;idx[i]++;}if(count == m)//出现m次的,返回return cur;}return -1;}
};

200 ms 24.4 MB


长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1198. 找出所有行中最小公共元素(二分/合并有序链表)相关推荐

  1. LeetCode 2058. 找出临界点之间的最小和最大距离

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   链表中的 临界点 定义 ...

  2. 编写程序,从键盘输人 10个整数,之间以一个空格隔开,存放在一维数组中。找出值最大和最小的元素,第一行输出最大值及其所在的元素下标,之间以一个空格隔开;第二行输出最小值及其所在的元素下标,之间以一个空

    题目:编写程序,从键盘输人 10个整数,之间以一个空格隔开,存放在一维数组中.找出值最大和最小的元素,第一行输出最大值及其所在的元素下标,之间以一个空格隔开;第二行输出最小值及其所在的元素下标,之间以 ...

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

    package com.homework.zw; //解题思路:先遍历二维数组的所有元素,用这些元素组成新的一维数组.然后利用冒泡排序找出一维数组的最大元素和最小元素. public class wo ...

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

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

  5. 找出无序数组中最小的k个数(top k问题)

    2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...

  6. LeetCode 1379. 找出克隆二叉树中的相同节点(二叉树遍历)

    1. 题目 给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target. 其中,克隆树 cloned 是原始树 original ...

  7. LeetCode 2058. 找出临界点之间的最小和最大距离(链表)

    文章目录 1. 题目 2. 解题 1. 题目 链表中的 临界点 定义为一个 局部极大值点 或 局部极小值点 . 如果当前节点的值 严格大于 前一个节点和后一个节点,那么这个节点就是一个 局部极大值点 ...

  8. LeetCode 1618. 找出适应屏幕的最大字号(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 text.并能够在 宽为 w 高为 h 的屏幕上显示该文本. 字体数组中包含按升序排列的可用字号,您可以从该数组中选择任何字体大小. 您可 ...

  9. python列表操作——列表嵌套列表,找出嵌套列表中共同的元素

    今天在项目中遇到了一个列表嵌套找出共同元素的问题,本来懒得造轮子,直接百度一波,查了一圈不是只有两个list就是使用Intersection这个函数,可能这个功能过于简单了没人写,我试着用Inters ...

最新文章

  1. ubuntu/debian 安装SSH,并开启
  2. php 防止倒链,PHP防止图片倒链
  3. Linux中切换用户变成-bash4.1-$的解决方法
  4. 201521123022 《Java程序设计》 第十三周学习总结
  5. Resin 优化配置
  6. Microsoft WPF VS Adobe Apollo
  7. 【链表】逆序打印链表
  8. 《Essential C++》笔记之迭代器Iterator(泛型指针)
  9. 我可以编写一个CSS选择器来选择不具有某个类或属性的元素吗?
  10. Linux系统(七)组管理和用户管理
  11. 揭秘Mindscape WPF Elements 5新特性
  12. 计算机上word如何批量打印,两种批量打印多个word文档的方式
  13. 计算机初学者先学什么语言,计算机语言入门先学什么?
  14. java 加密与解密算法,简单地加密和解密算法(java实现)
  15. 笔记本电脑WLAN突然没有了(连不上wifi)
  16. C/C++的灵魂—指针实现冒泡排序、选择排序和插入排序
  17. python面试自我介绍_python自我描述
  18. 百慕大永中为何有权继续开发集成Office?
  19. OSChina 周五乱弹 ——这年头吃屎都不安全了
  20. 新电脑到手如何验机?保姆级攻略来了

热门文章

  1. 解决: 'Cannot call `.is_valid()` as no `data=` keyword argument was ' AssertionError: Cannot call `
  2. mysql mtop_mysqlmtop2.2运行出错
  3. mysql select 子查询_SELECT中常用的子查询操作
  4. Bootstrap全局CSS样式之表单
  5. CodeForces - 796D Police Stations bfs
  6. 2 MyWarCraftStudio v0.6版
  7. STL容器之deque
  8. C++ 11 nullptr关键字
  9. 排序算法之冒泡排序(C/C++)
  10. 用指针实现高低位倒序,疯了吧