LeetCode第448题 Find All Numbers Disappeared in an Array解决办法

 

 

题目

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]


解决办法

这个问题的基本要求是:

1.对于一个给定的数组,大小为n,数组中的元素为1 ≤ a[i] ≤ n ,其中存在部分元素大小相同的情况,要求查找在1~n中有哪些数在数组中不存在。

2.除给定的数组和作为返回值的List外,不在分配额外的存储空间,且时间复杂度为O(n)。(PS.非强制要求)

方法一 [Time Limit Exceeded]

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> list = new ArrayList<Integer>();
        for(int i=1;i<=nums.length;i++){
            if(!isExist(i,nums))
                list.add(i);
        }
        return list;
    }
    
    public boolean isExist(int i,int[] nums){
        for(int j=0;j<nums.length;j++){
            if(nums[j]==i)
                return true;
        }
        return false;
    }
}

在这个方法中,我们采用线性搜索算法,这个算法比较简单,通过检查数组中的每个元素,一次一个地按顺序查找并判断特定值是否在列表中,直到找到所需的元素。如果找到一个对应元素,则返回true, 如果没有,就继续执行。在程序结束时返回false。

复杂性分析

  • 时间复杂度: O(n ^ 2)

  • 空间复杂度: O(1)。只使用了恒定的空间。

方法二 [Accepted]

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
         List<Integer> list = new ArrayList<Integer>();
         Set<Integer> set = new HashSet<Integer>();
         for(int i=1;i<=nums.length;i++){
             set.add(i);
         }
         for(int num:nums){
             set.remove(num);
         }
         list.addAll(set);
         return list;
     }
}

通过将1~n添加到set集合中,然后再将数组中存在的元素从set中remove掉,剩余的元素即1~n中不存在于数组里的数。

复杂性分析

  • 时间复杂度: O(n )

  • 空间复杂度: O(n)。创建Set集合消耗了额外的空间。

方法三 [Accepted]

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
		List<Integer> res = new ArrayList<Integer>();
		for(int i=0;i!=nums.length;i++){
			nums[Math.abs(nums[i])-1] = -Math.abs(nums[Math.abs(nums[i])-1]);
		}
		for(int i=0;i!=nums.length;i++){
			if(nums[i]>=0){
				res.add(i+1);
			}
		}
		return res;
	}
}

最巧妙的一个算法,通过将数组中指定位置的元素的值取反,最后通过值的正负来判断1~n中有哪些数不存在于数组中。比如nums[1]==4,则将数组中第四个元素取反,即nums[3] = -Math.abs(nums[3])。如果最后数组中nums[5]的值为正,即数组中第六个元素为正,就说明数组中不存在6。

复杂性分析

  • 时间复杂度: O(n)

  • 空间复杂度: O(1)。只使用了恒定的空间。

智慧社区的建设背景与需求 智慧社区的建设源于“互联网+”时代的呼唤,是业主刚需促成的社区变革。随着市场化进程的加速,传统社区面临着运营业务少、建设成本高、维护难度大、业务不精、增值服务少、无数据沉淀、运营模式单一等问。而新技术如大数据、云计算的崛起,为人与人、人与物、物与物之间的无界限连接提供了可能,推动了智慧社区的发展。业主对于智能家居、可视对讲、智能安防、社区消费、在线物业、社区互动等体验式社区的需求,也成为了购房的刚需。智慧社区的建设,旨在通过一站式服务提升楼盘品质及品牌溢价,简化物业系统,增强管理效率,降低建设及维护成本,为业主提供便捷、舒适的生活服务,并转型为服务提供商。 智慧社区的核心子系统与功能 智慧社区的建设依赖于多个核心子系统,包括视频监控、可视对讲、一卡通、背景音乐、信息发布等。视频监控子系统提供了全方位的安全保障,通过密码加密传输、数据库安全、云存储等技术,实现了录像的安全存储和智能分析,如全景监控、人员异常活动检测等功能。可视对讲子系统不仅实现了基本的对讲功能,还加入了人脸识别、远程开门、信息发布等智能化功能。一卡通子系统涵盖了门禁、考勤、消费、访客、梯控、巡更等多个应用场景,实现了统一数据库和身份认证体系下的便捷管理。此外,背景音乐子系统提供了定时广播、实时广播、事件联动等功能,而信息发布子系统则支持文字、图片、即时和任务播放,以及分组管理,为社区内的信息传播提供了便利。智慧社区还注重家居的智能化,通过情景模式预设、一键自动控制、系统传感器和逻辑功能自动运行等任务,以及兼容常规电器设备,为业主提供了舒适、健康、便利的居住环境。 智慧社区的运营方案与未来展望 智慧社区的运营方案包括开放的云平台、智能终端和丰富应用,旨在打造智慧社区行业生态圈。云平台的建设实现了海量信息存储、强大的计算能力,以及统一部署、统一服务、统一用户体验和降低成本的目标。交互客服平台的打造,通过公司门户网站、小区客服网站、业主个人中心等多渠道,建立了物业与业主之间的信任关系。智慧社区还提供了多方位的多媒体广告,搭建了用户与经营者之间的桥梁,增加了物业收入。同时,智慧社区还注重公私车位运营等增值业务,通过手机APP下单、确认租赁等方式,实现了车位的有效利用和物业收入的增加。未来,智慧社区将继续深化智能化建设,拓展更多应用场景,为业主提供更加便捷、舒适、智能的生活体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值