首页 > 其他分享 >442.数组中重复的数据 (Medium)

442.数组中重复的数据 (Medium)

时间:2023-06-13 16:56:48浏览次数:53  
标签:Medium nums 442 示例 整数 num 数组 size

问题描述

442. 数组中重复的数据 (Medium)

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1]
输出:[]

提示:

  • n == nums.length
  • 1 <= n <= 10⁵
  • 1 <= nums[i] <= n
  • nums 中的每个元素出现 一次两次

解题思路

参照41.缺失的第一个正数 (Hard),将数置反,如果已经是负数了,再减去nums.size()

这里要注意nums.size()是无符号整数,直接加上负号结果也不是负数。

代码

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        for (int i = 0; i < nums.size(); ++i) {
            int num = abs(nums[i]);
            if (num > nums.size()) {
                num -= nums.size();
            }
            if (nums[num - 1] > 0) {
                nums[num - 1] = -nums[num - 1];
            } else {
                nums[num - 1] -= nums.size();
            }
        }
        vector<int> res;
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] < -static_cast<int>(nums.size())) {
                res.push_back(i);
            }
        }
        return res;
    }
};

标签:Medium,nums,442,示例,整数,num,数组,size
From: https://www.cnblogs.com/zwyyy456/p/17478113.html

相关文章

  • 面试题 17.05. 字母与数字 (Medium)
    问题描述面试题17.05.字母与数字(Medium)给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。示例1:输入:["A","1","B","C","D","2","3",......
  • 1631.最小体力消耗路径 (Medium)
    问题描述1631.最小体力消耗路径(Medium)你准备参加一场远足活动。给你一个二维rowsxcolumns的地图heights,其中heights[row][col]表示格子(row,col)的高度。一开始你在最左上角的格子(0,0),且你希望去最右下角的格子(rows-1,columns-1)(注意下标从0开始编号)。......
  • 795.区间子数组个数 (Medium)
    问题描述795.区间子数组个数(Medium)给你一个整数数组nums和两个整数:left及right。找出nums中连续、非空且其中最大元素在范围[left,right]内的子数组,并返回满足条件的子数组的个数。生成的测试用例保证结果符合32-bit整数范围。示例1:输入:nums=[2,1,4,3],......
  • 802.找到最终的安全状态 (Medium)
    问题描述802.找到最终的安全状态(Medium)有一个有n个节点的有向图,节点按0到n-1编号。图由一个索引从0开始的2D整数数组graph表示,graph[i]是与节点i相邻的节点的整数数组,这意味着从节点i到graph[i]中的每个节点都有一条边。如果一个节点没有连出的有......
  • 2718. 查询后矩阵的和 (Medium)
    问题描述2718.查询后矩阵的和(Medium)给你一个整数n和一个下标从0开始的二维数组queries,其中queries[i]=[typeᵢ,indexᵢ,valᵢ]。一开始,给你一个下标从0开始的nxn矩阵,所有元素均为0。每一个查询,你需要执行以下操作之一:如果typeᵢ==0,将第index......
  • 28.找出字符串中第一个匹配项的下标 (Medium)
    问题描述28.找出字符串中第一个匹配项的下标(Medium)给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad......
  • 373. 查找和最小的 K 对数字 (Medium)
    问题描述373.查找和最小的K对数字(Medium)给定两个以升序排列的整数数组nums1和nums2,以及一个整数k。定义一对值(u,v),其中第一个元素来自nums1,第二个元素来自nums2。请找到和最小的k个数对(u₁,v₁),(u₂,v₂)...(uₖ,vₖ)。示例1:输入:nums1......
  • 2023.6.13 数组中不等三元组的数目
    直接的思路是三重循环\(O(n^3)\)解决,由于数据范围是\(n\leq100\),所以\(n^3\leq10^6\)可以过。如果想稍微优化一下的话,可以考虑下面两种思路,都是类似的:排序,排完序后相同的元素会聚集到一起,假设他们聚集在了区间\([i,j]\)内。那\([0,i-1]\)这一部分区间和\([j+1,n]\)......
  • C/C++学习(10)关于数组、内联函数、虚函数的错题集锦
    1、顺序存储方式不仅用于存储线性结构,还可以用于存放非线性结构,如完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式。 2、数组名有两重属性:1)数据结构的一个对象(数据结构为当前数组),在java中数组就是一个对象。2)某些情况下自动退化成指向第一个元素的常量指针。 3、有两......
  • 多维数组中指向的值
    #include<iostream>usingnamespacestd; intmain(){inta[2][2][3]={{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};int*ptr=(int*)(&a+1);printf("%d%d",*(int*)(a+1),*(ptr-1));return0;}输出结果为712*(int*)(a+1):指向数组a[......