算法复习:标记数组 / 数组

leetcode 239. 滑动窗口最大值

题解说用双端队列解,效率的确要高一点,有时间试试。

这里用标记数组实现的,先扫描一遍数组内记录比当前值大的下一个值的下标一边搜索

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k)
    {
       if(nums.size()==0)
            return nums;
        vector<int>result;
        if(k==0)
            return result;
        map<int,int>donser;
        for(int i=0;i<nums.size();i++)
        {
            int num=nums[i],lable=0;
            for(int j=i;j<nums.size();j++)
            {
                if(num<nums[j])
                {
                    donser[i]=j;
                    lable=1;
                    break;
                }
                if(lable==0)
                    donser[i]=-1;
            }
        }
        
        /*map<int,int>::iterator it;
        for(it=donser.begin();it!=donser.end();it++)
            cout<<"("<<it->first<<","<<it->second<<") ";
        cout<<endl;*/
        
        for(int i=0;result.size()<(nums.size()-k+1);i++)
        {
            //cout<<endl<<""<<i<<"->"<<donser[i]<<"  ";
            if(donser[i]==-1)
            {
                result.push_back(nums[i]);
                continue;
            }
            int x=donser[i],last=i;
            while(x<(i+k)&&x!=-1)
            {
                last=x;
                x=donser[x];
                //cout<<last<<"->"<<x<<" ";
            }
            result.push_back(nums[last]);
        }
        return result;
        
    }
};
leeltcode 239

leetcode 面试题21. 调整数组顺序使奇数位于偶数前面

对移动以后的顺序没有要求 ,思路:标记数组queue记录所有偶数下标的位置,遇到奇数就交换

class Solution {
public:
    vector<int> exchange(vector<int>& array) {
        if(array.size()<2)
            return array;
        queue<int>cool;
        for(int i=0;i<array.size();i++)
        {
            if(array[i]%2==0)
            {
                cool.push(i);
                continue;
            }
            if(!cool.size())
                continue;
            int j=cool.front();
            int tmp=array[j];
            array[j]=array[i];
            array[i]=tmp;
            cool.push(i);
            cool.pop();
        }
        return array;
    }
};
View Code

牛客网 调整数组顺序使奇数位于偶数前面

对移动后的前后顺序有要求,要保持原来的顺序,思路:插入排序,和相邻比较找到自己的位置

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int i=0;
        while(i<array.size())
        {
            if(array[i]%2==0)//偶数就不动
            {
                i++;
                continue;
            }
            //奇数向前提
            int tmp=i-1;
            int now=i;
            while(tmp>=0&&array[tmp]%2==0)
            {
                int change=array[now];
                array[now]=array[tmp];
                array[tmp]=change;
                tmp--;
                now--;
            }
            i++;
        }
    }
};
View Code

leetcode 4. 寻找两个有序数组的中位数

新建一个容器存合并以后的序列,到达中位数就输出

class Solution {
public:
    vector<int>result;
    double deal_1(vector<int>& nums1, vector<int>& nums2,int num)
    {
        int i=0,j=0;
        while(result.size()<=num&&i<nums1.size()&&j<nums2.size())
        {
            if(nums1[i]<nums2[j])
            {
                result.push_back(nums1[i]);
                i++;
            }
            else
            {
                result.push_back(nums2[j]);
                j++;
            }
        }
        if(result.size()!=num)
        {
            if(i==nums1.size())//i用完了
            {
                while(result.size()<=num)
                {
                    result.push_back(nums2[j]);
                    j++;
                }
            }
            else if(j==nums2.size())//j用完了
            {
                while(result.size()<=num)
                {
                    result.push_back(nums1[i]);
                    i++;
                }
            }
        }
        return result[num-1];
    }
    double deal_0(vector<int>& nums1, vector<int>& nums2,int num)
    {
        int i=0,j=0;
        while(result.size()<=num&&i<nums1.size()&&j<nums2.size())
        {
            if(nums1[i]<nums2[j])
            {
                result.push_back(nums1[i]);
                i++;
            }
            else
            {
                result.push_back(nums2[j]);
                j++;
            }
        }
        if(result.size()!=num)
        {
            if(i==nums1.size())//i用完了
            {
                while(result.size()<=num)
                {
                    result.push_back(nums2[j]);
                    j++;
                }
            }
            else if(j==nums2.size())//j用完了
            {
                while(result.size()<=num)
                {
                    result.push_back(nums1[i]);
                    i++;
                }
            }
        }
        return double(result[num-1]+result[num-2])/2;
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int nums=nums1.size()+nums2.size();
        if(nums<=2)
        {
            if(nums==1)
                return (nums1.size()>nums2.size()?nums1[0]:nums2[0]);
            if(nums==2)
            {
                if(nums1.size()==1)
                    return double(nums1[0]+nums2[0])/2;
                else
                    return (nums1.size()>nums2.size()?double(nums1[0]+nums1[1])/2:double(nums2[0]+nums2[1])/2);
            }
        }
        if(nums%2==1)//奇数个
            return deal_1(nums1,nums2,nums/2+1);
        else if(nums%2==0)//偶数个
            return deal_0(nums1,nums2,nums/2+1);
        return 0;
    }
};
leetcode 4
原文地址:https://www.cnblogs.com/dzzy/p/12313089.html