day30
2022/7/26 23:23:19
本文主要是介绍day30,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.剑指 Offer 17. 打印从 1 到最大的 n 位数
1)直接列举(执行用时比分治短)
1 class Solution { 2 public: 3 vector<int> printNumbers(int n) { 4 vector<int> res; 5 int num = 0; 6 for(int i = 0;i < n;i ++) 7 num = num * 10 + 9; 8 for(int i = 1;i <= num;i ++) 9 res.push_back(i); 10 return res; 11 } 12 };
2)分治
1 class Solution { 2 public: 3 vector<int> printNumbers(int n) { 4 int l = 1,r = 0; 5 for(int i = 0;i < n;i ++) 6 r = r * 10 + 9; 7 fun(l,r); 8 return res; 9 } 10 11 private: 12 vector<int> res; 13 void fun(int l,int r){ 14 if(l == r){ 15 res.push_back(l); 16 return; 17 } 18 fun(l,l + ((r - l) >> 1)); 19 fun(l + ((r - l) >> 1) + 1,r); 20 } 21 };
2.剑指 Offer 51. 数组中的逆序对
分治 + 归并排序1 class Solution { 2 public: 3 int reversePairs(vector<int>& nums) { 4 int n = nums.size(); 5 vector<int> tmp(n); 6 return mergeSort(nums,tmp,0,n - 1); 7 } 8 9 private: 10 int res; 11 int mergeSort(vector<int>& nums,vector<int>& tmp,int l,int r){ 12 if(l >= r) return 0; 13 int mid = (l + r) >> 1; 14 res = mergeSort(nums,tmp,l,mid) + mergeSort(nums,tmp,mid + 1,r); 15 int i = l,j = mid + 1; 16 for(int k = l;k <= r;k ++) 17 tmp[k] = nums[k]; 18 for(int k = l;k <= r;k ++){ 19 if(i == mid + 1) nums[k] = tmp[j ++]; 20 else if(j == r + 1 || tmp[i] <= tmp[j]) nums[k] = tmp[i ++]; 21 else{ //tmp[i] > tmp[j] (逆序对) 22 nums[k] = tmp[j ++]; 23 res += mid - i + 1; 24 } 25 } 26 return res; 27 } 28 };
这篇关于day30的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南