Leetcode 448 线性时间算法

来源:互联网 发布:php 循环拼接字符串 编辑:程序博客网 时间:2024/06/07 20:48

Leetcode 448 线性时间算法

想到的办法是以每个下标index代表index+1的状态,从头扫过去,每遇到一个元素时将这个元素暂存为curr,将此元素的位置上置空(-3表示)表示暂时这个位置对应的元素缺失,然后跳转到curr-1处,将此处置为存在(以-1表示),并将原来的在curr-1的位置上的元素存入curr中,重复执行直到遇到了负数或者curr=nums[curr-1],break出去之后再往下扫。

#include<stdio.h>#include<vector>#include<iostream>using namespace std;class Solution {public:    vector<int> findDisappearedNumbers(vector<int>& nums)    {        //has:-1,empty:-2,not has:-3        int length = nums.size();        int curr;        for(int i=0;i<length;i++)        {            if(nums[i]<0) continue;            curr = nums[i];            nums[i] = -3;            if(nums[curr-1]==curr)            {                nums[curr-1] = -1;                continue;            }            while(nums[curr-1]!=curr)            {                if(nums[curr-1]<0)                {                    nums[curr-1] = -1;                    break;                }                int old_index = curr-1;                curr = nums[curr-1];                nums[old_index] = -1;            }        }        vector<int> ans;        for(int i=0;i<length;i++)        {            if(nums[i]==-3) ans.push_back(i+1);        }        return ans;    }};int main(){    vector<int> v({4,3,2,7,8,2,3,1});    Solution s;    vector<int> ans = s.findDisappearedNumbers(v);    //cout<<'\n';    for(int i=0;i<ans.size();i++)        cout<<ans[i]<<' ';    return 0;}
原创粉丝点击