寻找数组中的缺失元素
来源:互联网 发布:hibernate 数据库配置 编辑:程序博客网 时间:2024/05/17 23:06
题目来源:
点击打开链接
问题描述:
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]
我的解决方案:
class Solution {public: vector<int> findDisappearedNumbers(vector<int>& nums) { /* 初版运行效率比较渣 vector<int> ret; for(int i=0;i<nums.size();++i) ret.push_back(i+1); for(int i=0;i<nums.size();++i) ret[nums[i]-1]=0; for(auto iter=ret.begin();iter!=ret.end();) { if(*iter == 0) iter=ret.erase(iter); else ++iter; } return ret; */ vector<int> ret; for(int i=0;i<nums.size();++i) { int n= abs(nums[i])-1; if(nums[n]>0) nums[n]=-nums[n]; } for(int i=0;i<nums.size();++i) { if(nums[i]>0) ret.push_back(i+1); } return ret; }};
思考:
由于不允许使用额外空间,所以第一反应用map来处理就被否掉了,观察题目要求数组中元素都是在大小都满足:1 ≤ a[i] ≤ n (n = size of array)这个约束,所以考虑是否可以通过再建立一个vec,在源数组中每访问一个数就把新vec对应下标的数设置位0,于是就有了第一版的方案,AC是没问题,但是执行效率太低,在leetcode里面排倒数的10%,所以想到优化,觉得瓶颈是在pop和删除上,那么可以思考一次性pop进去对的元素,没必要再删除一遍,反正没说源数组不能修改,就把每次的修改在源数组中进行,但是由于源数组中元素顺序不固定,如果仍然采用置0的方式,那么可能损失信息,所以采用改变符号的方式来进行.执行效率提高了很多,但是还是在后50%.做了如下修改之后有所改进,推测可能是因为内存cache的影响:
class Solution {public: vector<int> findDisappearedNumbers(vector<int>& nums) { vector<int> ret; for(int i=0;i<nums.size();++i) { if(nums[abs(nums[i])-1]>0) nums[abs(nums[i])-1]=-nums[abs(nums[i])-1]; } for(int i=0;i<nums.size();++i) { if(nums[i]>0) ret.push_back(i+1); } return ret; }};
- 寻找数组中的缺失元素
- 寻找数组中的主要元素
- 寻找数组中的主元素
- 寻找一个数组中的主元素
- 寻找数组中的第i小元素
- js 寻找数组中的重复元素
- 寻找连续数组中缺失的数字!!
- 寻找数组中的第i大的元素
- 利用快速排序中的切分函数寻找数组主元素
- 寻找数组中的第k小的元素
- 寻找数组中多余元素
- 同时寻找一个数组中的最大元素和最小元素--你会有所收获
- 寻找数组中的值
- 寻找数组中的众数
- 二维数组中的寻找
- 寻找数组中的第K大的元素&找数组中重复数字
- 剑指offer中取双元素法寻找数组中的最小值和最大值中的bug
- C++采用递归算法寻找一个整型数组中的最大元素
- Oracle EBS财务模块(一)基本功能
- Linux运维工程师必学必备的8项IT技能
- java中queue的使用
- android 休眠唤醒机制分析(二) — early_suspend
- Cron表达式手记(二)
- 寻找数组中的缺失元素
- 字符串转为数字。字符串转为数组。
- Twitter的分布式自增ID算法snowflake (Java版)
- Jquery 笔记
- 原生JS如何更准确的获取CSS样式
- [经典算法]优雅实现顺时针打印矩阵
- github常见操作和常见错误!错误提示:fatal: remote origin already exists.
- Java的JDBC事务详解
- visio 2013 连接线使用技巧