首页 > 其他 > 详细

645. 错误的集合

时间:2020-10-21 22:27:51      阅读:33      评论:0      收藏:0      [点我收藏+]

一、题目

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

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

示例 1:

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

注意:

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

二、题解

  • 嵌套for遍历找到错误值
  • 由于发生错误前后只有,数组只有正确值变成了错误值,其余的数不变,因此其余数的总和发生错误前后也相等
    • 正确总和 - 正确值 = 错误总和 - 错误值
    • 正确值 = 正确总和 - (错误总和 - 错误值)
    • 由于是从1开始连续的数,用等差数列求和——(最小值+最大值)*个数 / 2
      • 由于是从1开始连续的数,最小值为1
      • 由于是从1开始连续的无序数组,数组多长,最大值就应该有多大
class Solution {
    public int[] findErrorNums(int[] nums) {

        int wrongNum = 0;
        int rightNum = 0;
        int rightSum = 0;
        int wrongSum = 0;

        for (int i = 0; i < nums.length; i++) {
            for (int j = i+1; j < nums.length; j++) {
                if (nums[i]==nums[j]) {
                    wrongNum = nums[i];
                }
            }
            wrongSum+=nums[i];
        }

        rightSum = (1 + nums.length) * nums.length/ 2;
        rightNum = rightSum - (wrongSum - wrongNum);

        return new int[]{wrongNum,rightNum};
    }
}
  • 时间复杂度O(n^2)

  • 空间复杂度O(1),使用恒定的额外空间。

  • 执行用时:715 ms, 在所有 Java 提交中击败了5.62%的用户

  • 内存消耗:39.9 MB, 在所有 Java 提交中击败了90.52%的用户

645. 错误的集合

原文:https://www.cnblogs.com/Sheltonz/p/13854169.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!