领扣(LeetCode)错误的集合 个人题解

集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。

给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:

输入: nums = [1,2,2,4]
输出: [2,3]

注意:

  1. 给定数组的长度范围是 [2, 10000]。
  2. 给定的数组是无序的。

拿到这题,正常的思路,拿一个hashmap记录出现的次数,如果多次出现即为重复的数,记录下来。然后用另外一个循环记录缺失的数。执行速度不稳定,最高打败了50%的人

代码如下:

 1 class Solution {
 2     public int[] findErrorNums(int[] nums) {
 3         int[] ans = new int[2];
 4         Map<Integer, Integer> map = new HashMap<>();
 5         for (int i = 0; i < ans.length; i++) {
 6             if (!map.containsKey(ans[i])) {
 7                 map.put(nums[i], 1);
 8             } else {
 9                 ans[0] = nums[i];
10             }
11         }
12         for (int i = 0; i < nums.length; i++) {
13             if (!map.containsKey(ans[i])) {
14                 ans[1] = nums[i];
15                 break;
16             }
17         }
18         return ans;
19
20     }
21 }

考虑到Map的查找效率不是太高,于是改进版使用了一个标记数组来代替Map的功能。道理是一样的。形如 :标记数组[nums的值]=nums的值出现的个数

首先赋值标记数组全部为0,然后遍历nums给标记数组赋值,最后遍历标记数组,如果标记数组在index的值为2,则index这个数重复了两次,如果在index这个位置的值为0,则说明index这个数没有出现过。

这样做的效率变高了许多。

代码如下:

 1 class Solution {
 2     public int[] findErrorNums(int[] nums) {
 3         int[] ans = new int[2];
 4         int[] mark=new int[nums.length+1];
 5         Arrays.fill(mark, 0);
 6         for(int i=0;i<nums.length;i++)
 7         {
 8             mark[nums[i]]++;
 9         }
10         for(int i=1;i<mark.length;i++)
11         {
12             if(mark[i]==2)
13                 ans[0]=i;
14             if(mark[i]==0)
15                 ans[1]=i;
16         }
17         return ans;
18     }
19 }

原文地址:https://www.cnblogs.com/axiangcoding/p/10010140.html

时间: 2024-11-12 01:52:59

领扣(LeetCode)错误的集合 个人题解的相关文章

IIS错误处理集合

1.编译器错误消息: CS0016: 未能写入输出文件"c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\yaming\88832561\f6ecaa7\App_global.asax.noqfk5qp.dll"--"拒绝访问. "源错误: 解决方法: 在网上查了一些资料,通常的解决方法:原因是由于系统目录下的Temp目录无相应的权限所致,具体操作如下: 如上图所示,按图中红圈

【坑】这些天刷基础题犯的诡异错误大集合

这些天刷基础题犯的诡(sha)异(bi)错误大集合 by pkl ———其中可能会有部分资料引用,引用会表明链接,如果没有标明敬请指出QAQ抱歉QAQ---------------------------------- 首先安利一发帖子:OI中有哪些常数优化的小技巧 ps:注意是基础题.所以嘛错误nc需要原谅..毕竟我也是蒟蒻QAQAQ大蒟蒻QAQ · 循环里的临时变量出了循环便无效· 递归的临时变量不要定成全局变量· 赋值的对象不要一不小心手抖写反了…比如b = a写成a = b[估计也只有我

LeetCode: Container With Most Water 题解

Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a containe

领扣-两数之和-Python实现

领扣每日一题 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] ''' 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数.

Leetcode 第174场周赛 题解

Leetcode 第174场周赛 题解 方阵中战斗力最弱的 K 行 签到题,统计一下每行的军人数量,然后设置一下排序规则即可. 时间复杂度 \(O(nlogn)\) typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i --) #define INF 0x3f3f3f3f3f3f3f3

Leetcode 第175场周赛 题解(完结)

Leetcode 第175场周赛 题解 检查整数及其两倍数是否存在 数据范围小的可怜,\(O(n^2)\) 解法可行.如果范围大一点,可以先进行排序然后遍历每一个数进行二分查找,时间复杂度 \(O(nlogn)\) 代码是平方解法. typedef long long ll; typedef double db; #define _for(i,a,b) for(int i = (a);i < b;i ++) #define _rep(i,a,b) for(int i = (a);i > b;i

领扣(LeetCode)合并两个有序数组 个人题解

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素. 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6] 这道题,第一想法是动态插入,但是种种错误

领扣(LeetCode)二维区域和检索 个人题解

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2). 上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8. 示例: 给定 matrix = [ [3, 0, 1, 4, 2], [5, 6, 3, 2, 1], [1, 2, 0, 1, 5], [4, 1, 0, 1, 7], [1, 0, 3, 0, 5] ] sumRegi

领扣(LeetCode)独特的电子邮箱地址 个人题解

每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔. 例如,在 [email protected]中, alice 是本地名称,而 leetcode.com 是域名. 除了小写字母,这些电子邮件还可能包含 ',' 或 '+'. 如果在电子邮件地址的本地名称部分中的某些字符之间添加句点('.'),则发往那里的邮件将会转发到本地名称中没有点的同一地址.例如,"[email protected]" 和 "[email protected]" 会转发到同一电子邮件