[关闭]
@snuffles 2019-04-02T15:06:59.000000Z 字数 1073 阅读 773

L645 错误的集合

数组


集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。

给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:
输入: nums = [1,2,2,4]
输出: [2,3]
注意:
给定数组的长度范围是 [2, 10000]。
给定的数组是无序的。

解1:将乱序的数字放在正确的位置上,
12235->
当i=0 nums[0]==nums[1-1];
当i=1 nums[1]==nums[2-1];
当i=2 nums[2]==nums[2-1];
当i=3 nums[3]!=nums[3-1];swap12325;nums[3]==nums[2-1];
当i=4 nums[4]==nums[5-1];

  1. vector<int> findErrorNums(vector<int>& nums) {
  2. vector<int> res;
  3. for(int i=0;i<nums.size();i++){
  4. while(nums[i]!=nums[nums[i]-1]){
  5. //while(i!=nums[i]-1){
  6. swap(nums[i],nums[nums[i]-1]);
  7. }
  8. }
  9. for(int i=0;i<nums.size();i++){
  10. if(nums[i]!=i+1) return {nums[i],i+1};
  11. }
  12. return res;
  13. }

原来的做法:出现重复的则为重,出现跳变的则存在缺失

  1. class Solution {
  2. public:
  3. vector<int> findErrorNums(vector<int>& nums) {
  4. vector<int> res(2,0);
  5. sort(nums.begin(),nums.end());
  6. bool repeat=false;
  7. bool lost=false;
  8. for(int i=0;i<nums.size();i++){
  9. if((i>=1 && nums[i-1] == nums[i])){
  10. res[0] = nums[i];
  11. repeat = true;
  12. }
  13. if(i+1<nums.size() && nums[i+1]-nums[i]>1){
  14. res[1] = nums[i]+1;
  15. lost = true;
  16. }
  17. if(repeat && lost) return res;
  18. }
  19. if(!lost && nums[0]==1) res[1]=nums.size();
  20. if(!lost && nums[0]!=1) res[1]=1;
  21. return res;
  22. }
  23. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注