1.寻找两个正序数组的中位数
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
思路一:对比两个数组,一直查找到len/2(len为两个数组的长度和),如果len是奇数,就返回left和right相加和除以二,否则返回right。复杂度是O(m+n)
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int len1=nums1.size(); int len2=nums2.size(); int len=len1+len2; int left=-1,right=-1;//记录中位数,如果是奇数就返回right,是偶数则返回二者相加除以2 int ans1=0,ans2=0; for(int i=0;i<=(len/2);i++) { left=right;//这里是保证left是right的上一个数 if(ans1<len1&&(ans2>=len2||nums1[ans1]<nums2[ans2]))//注意这个条件 { right=nums1[ans1++];//数组1的值小于数字2,数组一后移 } else { right=nums2[ans2++];//否则数组二后移 } } if((len&1)==0) { return (left+right)/2.0; } else { return right; } } };
2.剪绳子
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
class Solution { public: int cutRope(int number) { if(number<2) return 0; if(number==2) return 1; if(number==3) return 2;//特殊情况 //动态规划 vector<int> best(number+1,0);//用于存储不同长度绳子的最优值 best[0]=0; best[1]=1; best[2]=2; best[3]=3; for(int i=4;i<=number;i++)//由小到达计算函数值 { for(int j=1;j<=i/2;j++) { best[i]=max(best[i],best[j]*best[i-j]); } } int res=best[number]; return res; /* 贪婪,如果绳子长度大于等于5,就减3,一直减到小于5 int sum=0; int res=1; while(number>=5) { number-=3; sum++; } for(int i=0;i<sum;i++) { res*=3; } if(number==4) return res*4; if(number==3) return res*3; if(number==2) return res*2;*/ } };