2026/1/9 10:15:08
网站建设
项目流程
企业网站建设信息管理平台的立项目的,cms做淘宝客网站,免费网站的平台,如何做一个宣传链接题目#xff1a;
给你一个长度为 n 的整数数组 nums #xff0c;其中 nums 的所有整数都在范围 [1, n] 内#xff0c;且每个整数出现 最多两次 。请你找出所有出现 两次 的整数#xff0c;并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间给你一个长度为 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]输出[]解析这道题的思想是原地哈希因为题目中比较特殊数组中每一个数的值是在[1,n]这个区间中数组的长度也刚好为n所以我们可以借助数组中某个数的前一个索引表示这个数是否出现过如果没出现过就将这个数减一作为下标对应的元素设置为负数。举个例子比如数组有个元素为4那么我们将arr[4-1]对应的那个元素乘以-1变为负数那么下次我们再次遇到4这个数的时候我们去查看arr[4-1]对应的元素如果对应的元素为负数那么说明元素4之前出现过一次具体代码/** * 找出数组中所有出现两次的元素LeetCode 442题 * 条件1 ≤ nums[i] ≤ nn为数组长度每个元素最多出现两次 * param {number[]} nums - 输入数组元素值在[1, n]范围内 * return {number[]} - 返回所有出现两次的元素 */varfindDuplicatesfunction(nums){// 存储结果的数组letres[]// 遍历数组中的每个元素for(leti0;inums.length;i){// 取当前元素的绝对值因为可能已经被标记为负数letkMath.abs(nums[i])// 检查 nums[k-1] 这个位置的值// - 如果 nums[k-1] 0说明数字 k 是第一次出现// - 如果 nums[k-1] 0说明数字 k 之前已经出现过一次现在是第二次出现// 核心思路用索引 (k-1) 位置的符号来标记数字 k 是否出现过if(nums[k-1]0){// 第一次遇到数字 k将 nums[k-1] 标记为负数// 负号作为已访问标记不影响我们通过 Math.abs 获取原始值nums[k-1]*-1}else{// 第二次遇到数字 k当前 nums[k-1] 已经是负数// 说明 k 是重复元素将其加入结果数组res.push(k)}}// 返回所有出现两次的元素returnres};