算法复习:标记数组 / 数组
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; } };
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; } };
对移动后的前后顺序有要求,要保持原来的顺序,思路:插入排序,和相邻比较找到自己的位置
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++; } } };
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; } };