热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

448.FindAllNumbersDisappearedinanArray

题目Givenanarrayofintegerswhere1≤a[i]≤ n (n sizeofarray),someelementsappeartwiceandothersapp

题目

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

Example:

Input:
[4,3,2,7,8,2,3,1]

Output:
[5,6]

分析

n位整数数组本应包含1~n所有数,实际缺少了其中一些,找出这些缺少的数。

限制条件:不占用额外空间(除返回的list以外),时间复杂度O(n)


解答

解法1:把数组下标+1当做一个"新数组",出现的则将对应下标+1标记为负数,未标记的下标+1则是未出现的数(18ms)

遍历数组,遇到4则将数组中第4个数(下标为3)修改为负数

再次遍历数组,若第m个数(下标为m-1)没有被修改为负数,意味着m是数组中缺少的数

例:

 1   2   3   4   5   6   7   8  (下标+1)

 4   3   2   7   8   2   3   1

-4 -3  -2  -7   8   2  -3  -1  

 1 public class Solution {
 2     public List findDisappearedNumbers(int[] nums) {
 3         List list = new ArrayList();
 4         for (int i = 0; i ){
 5             nums[Math.abs(nums[i])-1] = - Math.abs(nums[Math.abs(nums[i])-1]);
 6             //最内部绝对值:遍历到已被标记为负数的数时,要用其绝对值来寻找下标
 7             //最外部绝对值:重复出现的数,下标已被标记过一次,再直接求相反数会又变为正,需先绝对值再求相反数
 8         }
 9         for (int i = 0; i ){
10             if(nums[i] > 0){
11                 list.add(i + 1);
12             }
13         }
14         return list;
15     }
16 }

解法2:解法1中的第5行拆开写(17ms√)

 1 public class Solution {
 2     public List findDisappearedNumbers(int[] nums) {
 3         List list = new ArrayList();
 4         for (int i = 0; i ){
 5             int index = Math.abs(nums[i])-1;
 6             if(nums[index] > 0)
 7                 nums[index] = - nums[index];
 8         }
 9         for (int i = 0; i ){
10             if(nums[i] > 0){
11                 list.add(i + 1);
12             }
13         }
14         return list;
15     }
16 }

448. Find All Numbers Disappeared in an Array


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
author-avatar
时刻要有危机感01
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有