ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

有意思的leetcode~

2022-02-20 01:01:09  阅读:164  来源: 互联网

标签:特征值 有意思 nums int 题解 数组 思路 leetcode


夜深人静写力扣

前言

这几天好兄弟Matty吴分享了几道力扣的题,虽然是简单难度,但是思维要求我觉得还是有点要求的,思路很有趣,记录一下~~

1380.矩阵中的幸运数

题目描述

给你一个\(m*n\)的矩阵,矩阵中的数字各不相同。请你按任意顺序返回矩阵中的幸运数。幸运数字是指矩阵中满足同时下列两个条件的元素:

  • 在同一行的所有元素中最小
  • 在同一列的所有元素中最大

原题目链接:1380. 矩阵中的幸运数 - 力扣

思路说明

实话说,一开始看到这道题是有点懵的,找不到一点思路。如果暴力遍历的话,后面的判断条件以我的功力应该会写的非常拉跨且混乱。还好还好,力扣不缺大佬,此处参考的是宫水三叶大佬的题解和思路(会添加上自己的理解和思路):题解链接

这里使用的思想是模拟思想。简单说说我自己对模拟的理解:在我看来模拟的关键是用代码实现(模拟过程)题目中的要求或者限制,所以对我们的考验就是能不能理解题意并且将它转变为编程语言。回到这道题,最主要的限制是:同行最小,同列最大。这里我们可以将它分解成行和列两部分来验证,也就是使用两个数组来分别存放每行和每列中的最小和最大数值,最后一部开始验证同一位置下的数字是否一致,若一致则说明是幸运数字。最后只需要考虑输出形式就可以了~

代码

		int[] row = new int[55],col = new int[55];
		int n = matrix.length , m = matrix[0].length;
        for(int i = 0 ; i < n ; i++){
            row[i] = 100001;
            for(int j = 0 ; j < m ; j++){
                row[i] = Math.min(row[i],matrix[i][j]);
                col[j] = Math.max(col[j],matrix[i][j]);
            }
        }
        List<Integer> ans = new ArrayList<>();
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < m ; j ++){
                int t = matrix[i][j];
                if(t == row[i] && t == col[j]) ans.add(t);
            }
        }
        return ans;

1608.特殊数组的特征值

题目

给你一个非负整数数组 nums 。如果存在一个数 x ,使得 nums 中恰好有 x 个元素 大于或者等于 x ,那么就称 nums 是一个 特殊数组 ,而 x 是该数组的 特征值 。

注意: x 不必 是 nums 的中的元素。

如果数组 nums 是一个 特殊数组 ,请返回它的特征值 x 。否则,返回 -1 。可以证明的是,如果 nums 是特殊数组,那么其特征值 x 是 唯一的 。

原题目链接:1608. 特殊数组的特征值

思路

这道题虽然说是简单题,但是思路确实很难找到。说实话一开始看到数组长度在100以内且元素大小1000以内,就觉得应该要用暴力解法,但是具体到实现,又不知道如何写了。看了眼题解,就发现了一个很妙的解法:题解链接

这里的做法是不考虑排序,因为可能会出现重复数字且这道题不关心元素的索引位置,所以我们只要统计每个数字出现的次数就好了,最后就可以将每次数字出现的次数加起来验证特征值。我们使用一个长度比输入大一的数字用来计算(用索引表示数字,元素表示出现次数)。一个比较关键的点:特征值一定在1到数组最大值之间(这里可以自己推导验证一下,结果是成立的)。之后就是使用后序遍历了(因为特征数定义的范围是大于等于,那么这里用倒序会比较好一点(我们那个计数数据是1-N的嘛,倒序来计算,就可以直接累加计算,不用再去减其他一些东西)。

以上就是大概的思路,表达有点不清楚,还是建议参考题解。

代码

class Solution {
    public int specialArray(int[] nums) {
        int maxnum = 0;
        for(int num : nums){
            if(num > maxnum){
                maxnum = num;
            }
        }
        int[] count = new int[maxnum+1];
        for(int num : nums){
            count[num] += 1;
        }
        int sum = 0;
        for(int i = maxnum ; i >= 0 ; i--){
            sum += count[i];
            if(sum == i){
                return i;
            }
        }
        return -1;
    }
}

后续

其实还有一道有意思的题目,也是这位好兄弟的分享,不过这道题当时的思路很清晰,后来也就没考虑把它记录下来了。Anyway,夜深人静写力扣的思路确实会清晰很多hhh~

标签:特征值,有意思,nums,int,题解,数组,思路,leetcode
来源: https://www.cnblogs.com/ZeeWay/p/15914365.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有