zoukankan      html  css  js  c++  java
  • 算法复习:标记数组 / 数组

    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
  • 相关阅读:
    (转载)构建public APIs与CORS
    SpringMVC 参数注入
    java删除文件夹
    idea 自动提示生成 serialVersionUID
    JSP自定义tag
    gradle中使用嵌入式(embedded) tomcat, debug 启动
    spring in action 4th --- quick start
    Date, TimeZone, MongoDB, java中date的时区问题
    spring boot 添加拦截器
    HTTP status code
  • 原文地址:https://www.cnblogs.com/dzzy/p/12313089.html
Copyright © 2011-2022 走看看