力扣刷题之路-统计数组中的元素

参考刷题顺序: 力扣刷题顺序

涉及题目

力扣刷题之路-统计数组中的元素
自己的想法:
刚开始想的是利用list的indexOf方法,来查找丢失的和重复的。但是花费的时间太多。首先对数组进行排序,如果前后相等,则是重复,如果前后间隔为2,则是缺少。
class Solution {
    public int[] findErrorNums(int[] nums) {
                int n=nums.length;
                int[] result = new int[2];
                Arrays.sort(nums);
                if(nums[0]!=1) result[1]=1;
                else if(nums[n-1]!=n) result[1]=n;
                for(int i=0;i<n-1;i++){ if(nums[i]="=" nums[i+1]){ result[0]="nums[i];" } if(nums[i+1]-nums[i]="=" 2){ result[1]="nums[i]+1;" return result; < code></n-1;i++){>

697.数组的度

力扣刷题之路-统计数组中的元素

自己的想法:题目中有三个关键的数字,第一个是每个数字出现次数,第二个是每个数字第一次出现的位置,第三个就是每个数字最后一次出现位置,也可以进一步理解为子串长度。自己的想法是用hashmap来存放,key即为数字,value为数组,数组中第一个值存放出现次数,第二个值存放第一次出现位置,第三次存放最后一次出现位置-第一次出现位置。

public void mytest(){
        int[] nums = {1,2};
        //&#x8BA1;&#x7B97;&#x6570;&#x7EC4;&#x7684;&#x5EA6; &#x5E76;&#x8FD4;&#x56DE;&#x5EA6;&#x76F8;&#x540C;&#x7684;&#x6700;&#x5C0F;&#x8FDE;&#x7EED;&#x5B50;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
        HashMap numsMap = new HashMap();
        int max=0;//max&#x8BB0;&#x5F55;&#x6700;&#x5927;&#x51FA;&#x73B0;&#x6B21;&#x6570;&#xFF0C;min&#x8BB0;&#x5F55;&#x6700;&#x5C0F;&#x5B50;&#x4E32;&#x957F;&#x5EA6;
        int min=nums.length;
        //1&#x662F;&#x51FA;&#x73B0;&#x6B21;&#x6570;&#xFF0C;2&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x51FA;&#x73B0;&#x4F4D;&#x7F6E;&#xFF0C;3&#x6700;&#x540E;&#x4E00;&#x6B21;&#x51FA;&#x73B0;&#x4F4D;&#x7F6E;-&#x7B2C;&#x4E00;&#x6B21;&#x51FA;&#x73B0;&#x4F4D;&#x7F6E;(&#x5373;&#x5B50;&#x4E32;&#x957F;&#x5EA6;
        for(int i=0;i<min;i++){ int[] temp="new" int[3]; if(numsmap.containskey(nums[i])){ numsmap.get(nums[i]); temp[0]++; temp[2]="i-temp[1]+1;" numsmap.replace(nums[i],temp); } else{ temp[0]="1;" temp[1]="i;" numsmap.put(nums[i],temp); if(temp[0]>max) max=temp[0];
        }

        //&#x627E;&#x51FA;1&#x5217;&#x6700;&#x5927;&#x7684;&#xFF0C;3&#x5217;&#x6700;&#x5C0F;&#x7684;
        Iterator iterator = numsMap.keySet().iterator();
        while (iterator.hasNext()){
            Object next = iterator.next();
            int[] o = (int[]) numsMap.get(next);
            if(o[0] == max){
                if(o[2]<min){ min="o[2];" } system.out.println(min); < code></min){></min;i++){>

没想到和官方想法是差不多的。但是这个提交之后运行速度和内存消耗都太大,很不理想。

解题后想法:
参考了解题区一位大佬的想法,只利用一次遍历实现,和上边的想法差不多,但是只在一次数组的遍历中实现,感觉非常巧。

   public void thTest(){
        int[] nums = {1, 2};
        //&#x8BA1;&#x7B97;&#x6570;&#x7EC4;&#x7684;&#x5EA6; &#x5E76;&#x8FD4;&#x56DE;&#x5EA6;&#x76F8;&#x540C;&#x7684;&#x6700;&#x5C0F;&#x8FDE;&#x7EED;&#x5B50;&#x6570;&#x7EC4;&#x7684;&#x957F;&#x5EA6;
        Map<integer,int[]> numsMap = new HashMap<>();
        int max=0,min=0,len=nums.length;//max&#x8BB0;&#x5F55;&#x6700;&#x5927;&#x51FA;&#x73B0;&#x6B21;&#x6570;&#xFF0C;min&#x8BB0;&#x5F55;&#x6700;&#x5C0F;&#x5B50;&#x4E32;&#x957F;&#x5EA6;
        //&#x53C2;&#x8003;&#x60F3;&#x6CD5;&#xFF1A;&#x4E00;&#x6B21;&#x904D;&#x5386;&#x5B9E;&#x73B0;&#xFF0C;&#x904D;&#x5386;&#x4E00;&#x6B21;&#x6570;&#x7EC4;&#xFF0C;&#x5728;&#x904D;&#x5386;&#x4E2D;&#x66F4;&#x65B0;max&#x548C;min&#x3002;&#x6570;&#x7EC4;&#x5B58;&#x653E;&#x51FA;&#x73B0;&#x6B21;&#x6570;&#xFF0C;&#x4EE5;&#x53CA;&#x7B2C;&#x4E00;&#x6B21;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E;
        for(int i=0;i<len;i++){ int[] temp="numsMap.get(nums[i]);" if(temp="=" null){ int[]{1,i}; numsmap.put(nums[i],temp); } else { temp[0]++; if (temp[0]> max) {
                max = temp[0];
                min = i - temp[1] + 1;
            } else if (temp[0] == max) {
                min = Math.min(i - temp[1] + 1, min);
            }
        }
        System.out.println(min);
    }
</len;i++){></integer,int[]>

448.找到所有数组中消失的数字

力扣刷题之路-统计数组中的元素
自己的想法:本来是准备对最后返回的list进行一些操作,但是总是超出时间限制,后来突然想到可以对输入的nums数组进行操作。想法是对nums中的数据进行一个重新排列,让数字在对应的位置上,例如4,就在数组的第三个位置上。如果应该在的位置已经有正确的数字了,即重复的时候,就把重复位置设置为0。这样最后的数组就会变成,每个数字都在对应的位置,缺少的数字的位置就是0。然后再对数组进行一个遍历,是0的位置的索引值添加到list中。
    public void test(){
        int[] nums = {4,3,2,7,8,2,3,1};
        List list = new ArrayList();
        int temp;
        for(int i = 0;i<nums.length;){ int ind="nums[i]-1;" if(nums[i]="=0){" i++; } else if(nums[i]!="i+1){" if(nums[ind]!="nums[i]){" temp="nums[ind];" nums[ind]="nums[i];" nums[i]="temp;" else{ for(int i="0;i<nums.length;i++){" list.add(i+1); system.out.println(list); < code></nums.length;){>

官方想法:官方想法也是对原数组进行操作,不过这个操作更加简单粗暴。每遇到一个数就让这个数正确位置的数值加n,这样这个位置的数必定大于n。再遍历一次数组,如果没有大于n就是缺失的。

    public void thTest(){
        int[] nums = {4,3,2,7,8,2,3,1};
        List list = new ArrayList();
        int len = nums.length;
        for(int i=0;i<len;i++){ int x="(nums[i]-1)%len;" nums[x]+="len;" } for(int i="0;i<len;i++){" if(nums[i]<="len){" list.add(i+1); system.out.println(list); < code></len;i++){>

442.数组中重复的数据

力扣刷题之路-统计数组中的元素
自己的想法:和448一样,对原数组进行操作。重复的时候加n,这样重复的数字所在的位置就会大于n。
    public void mytest(){
        int[] nums = {10,2,5,10,9,1,1,4,3,7};
        List list = new ArrayList();
        int len = nums.length;
        int temp;
        for(int i=0;i<len;){ int ind="nums[i]-1;" if((i+1)="=nums[i]" || nums[i]>len || nums[ind]>len){
                i++;
            }
            else if(nums[i] != nums[ind]){
                temp = nums[i];
                nums[i]=nums[ind];
                nums[ind]=temp;
            }
            else if(nums[i] == nums[ind]){
                nums[ind]+=len;
                i++;
            }

        }
        for(int i=0;i<len;i++){ if(nums[i]>len){
                list.add(i+1);
            }
        }
        System.out.println(list);
    }
</len;i++){></len;){>

看了大佬的一个解题思路,和448也是一样的,唯一不同的是最后添加到list当中的数值成了大于2*n的。本来也想用448的官方思想解过,但是一直想的是-n,没有仔细观察数组,哎。还是要多观察。

        List list = new ArrayList();
        int len = nums.length;
        for(int num:nums){
            int x = (num - 1)%len;
            nums[x]+=len;
        }
        for(int i=0;i<len;i++){ if(nums[i]>2*len){
                list.add(i+1);
            }
        }
</len;i++){>

41.缺失的第一个正数

力扣刷题之路-统计数组中的元素
自己的想法:感觉这几道题都可以用一套代码来做,就是某些细节需要进行修改。想法和448相同,把数字放到该在的位置上。但是遇到0、负数、大于n的数都直接跳过。这样数组就按照顺序摆放了,第一个没有在正确位置上的数就是要求的结果。
    public int firstMissingPositive(int[] nums) {
        int len = nums.length;
        int res=len+1;
        int temp;
        for(int i = 0;i<nums.length;){ int ind="nums[i]-1;" if(nums[i]<="0" || nums[i]>len){
                i++;
            }
            else if(nums[i]!=i+1){
                if(nums[ind]!=nums[i]){
                    temp=nums[ind];
                    nums[ind]=nums[i];
                    nums[i]=temp;
                }
                else{
                    nums[i] =0;
                    i++;
                }
            }
            else i++;
        }
        for(int i=0;i<len;i++){ if(nums[i]<="0" || nums[i]>len) {
                res = i + 1;
                break;
            }
            //System.out.println(nums[i]);
        }
        return res;
    }
</len;i++){></nums.length;){>

官方的解题思路其实是差不多的,但是没有进行交换,而是对数字应该在的位置进行了标记。

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for (int i = 0; i < n; ++i) {
            if (nums[i] <= 0) { nums[i]="n" + 1; } for (int i="0;" < n; ++i) int num="Math.abs(nums[i]);" if (num nums[num - 1]="-Math.abs(nums[num" 1]); (nums[i]> 0) {
                return i + 1;
            }
        }
        return n + 1;
    }
}
</=>

274.H指数

力扣刷题之路-统计数组中的元素
这个题目没有自己的想法,主要是真的看不懂题目啊!这表达弯弯绕绕的。心情不好,看不下去这题目。

官方想法:用一个标志来表示h,刚开始是0。排序之后从最大的开始加1。这题的难度可能就在看懂题目吧。

    public int hIndex(int[] citations) {
        int len = citations.length;
        int res=0;
        Arrays.sort(citations);
        for(int i=len-1;i>=0;i--){
            if(citations[i]>res) res++;
        }
        return res;
    }

Original: https://www.cnblogs.com/boboray/p/16219509.html
Author: 啵啵ray
Title: 力扣刷题之路-统计数组中的元素

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/685602/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • HTTP协议和SOCKS5协议

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/panxuejun/p/10584993.htmlAut…

    技术杂谈 2023年5月30日
    074
  • Go基础:基础语法与使用

    这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。 1. 变量 声明变量 var a int var b string var c []float32 // 这种形式…

    技术杂谈 2023年7月24日
    060
  • 剑指offer计划链表

    剑指offer计划链表 从尾到头打印链表 /** * public class ListNode { * int val; * ListNode next = null; * * …

    技术杂谈 2023年7月25日
    055
  • 网络安全(一):信息收集之玩转nmap(理论篇)

    更新时间 2022年09月06日16:20:10 完成nmap介绍,目标选择,主机发现部分 2022年10月28日21:19:20 完成最基本的内容,端口扫描,版本和系统探测,安全…

    技术杂谈 2023年6月21日
    095
  • 为什么重写equals必须重写hashCode

    equals常见面试题 为什么要重写equals 重写equals不重写hashCode会存在什么问题 总结 equals常见面试题 在开始聊之前,我们先看几个常见的面试题,看看你…

    技术杂谈 2023年7月11日
    054
  • nginx禁止直接ip、未配置域名访问配置

    问题背景 最近偶然对线上域名配置的nginx IP进行直接访问后,发现http居然是可以通的,而https直接IP访问浏览器会报证书不安全的提示,点击详细查看发现是固定返回了ngi…

    技术杂谈 2023年6月21日
    0113
  • 相似图片搜索的原理(二)

    文章转自:http://blog.jobbole.com/85956/ 之前转过一篇文章,介绍了相似图片的搜索原理,今天又看到了另外一篇文章,用另外一种方式处理这个问题: 相似图片…

    技术杂谈 2023年6月1日
    091
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之EXCEL数据导出(十三)

    基于Vue和Quasar的前端SPA项目实战之数据导出(十三) 回顾 通过之前一篇文章基于Vue和Quasar的前端SPA项目实战之数据导入(九)的介绍,通过配置的方式可以零代码实…

    技术杂谈 2023年7月24日
    073
  • 数据库篇:mysql锁详解

    前言 sql事务的执行,如果需要锁定数据进行更新操作,则必定离不开锁 共享锁和排他锁 表锁 行锁 Record Lock 间隙锁 Gap Lock 行锁+间隙锁 Next-Key …

    技术杂谈 2023年7月25日
    066
  • ifmodule

    <ifmodule test>…</ifmodule test>配置段用于封装根据指定的模块是否启用而决定是否生效的指令。在 <ifmodule&…

    技术杂谈 2023年5月31日
    085
  • 设计模式-代理模式

    概念:二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标 方法的时候,不再是直接对目标方法进行调用,而是通过代理类 间接调用。让不属于目标方…

    技术杂谈 2023年7月11日
    074
  • Linux 实用命令

    实用命令: 1、查看端口占用情况 &#x67E5;&#x770B;&#x8BE5;&#x7AEF;&#x53E3;&#x662F;&…

    技术杂谈 2023年6月21日
    094
  • Mstar 平台(648)唤醒之串口唤醒

    串口唤醒功能主要是从supernova 待机进入PM后,串口接收PC端口发送过来的特定字串,然后将主板唤醒的功能。与IR,KEYPAD,WOL,CEC,MHL 等等基本流程一致,触…

    技术杂谈 2023年5月31日
    0118
  • C++处理系统相关权限问题

    权限问题处理是日常开发过程中很常见的一个操作,这里记录一下使用方法 1、给某个文件或文件夹赋予特定用户的特定访问权限 /* 给文件(夹)szPath设置用户名为pszAccount…

    技术杂谈 2023年7月10日
    068
  • 禁用Windows重复数据删除

    重复数据删除,可以减少磁盘占用,但使用不当也有可能增加IO,另外,也为此功能会将硬盘分块,所以当硬盘占用较高时,进行碎片整理也比较困难,所以有时需要禁用掉重复数据删除功能,并解除重…

    技术杂谈 2023年5月31日
    078
  • 【转】Xcode插件管理工具Alcatraz

    Original: https://www.cnblogs.com/wi100sh/p/13093073.htmlAuthor: wi100shTitle: 【转】Xcode插件管…

    技术杂谈 2023年6月1日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球