题目1(寻找峰值)
收获
1:由于只要找到一个峰值即可,所以采用类似二分查找的方法,同时判断中间的两个值,如果前者大于后者则最大值的右边界变成前者,如果小于则最大值的左边界变成后者,依据此直到找到最大值
代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int findPeakElement(vector<int>& nums) {
// write code here
int left=0,right=nums.size()-1;
while(left<right){
int mid=(right+left)/2;
if(nums[mid]>nums[mid+1])
right=mid;
else
left=mid+1;
}
return right;
}
};
题目2(数组中的逆序对)
收获
1:这道题很大的收获就是对一些较难的题,时间的积累是会有收获的,刚开始第一次看这道题可能真的会理解好久,不懂作者为什么这么写,例如for(int i=left;i<=right;i++)这里的里面的if3次判断,刚开始一直不懂为什么是这样,后来理解了过后发现真的是巧用,会节省好多代码,此外关于归并排序的应用自己还要再理解理解,稍微懂其中的一点原理,但是还是不能自己手写出来一个归并排序,归并融合递归解这道题对于初次学这种题的自己还是有些难度的,但是也体会到了写代码有的时候不知道为啥,但是真的可以背下来经典的代码,相信随着时间的流逝自己会理解的~
代码
//这道题应该有两种方法可以解,一个是暴力求解,自己先手写一下,然后再使用归并排序的思想
//解一下!!!
// class Solution {
// public:
// int InversePairs(vector<int> data) {
// int times=0;
// int n=data.size();
// for(int i=0;i<n-1;i++){
// for(int j=i+1;j<n;j++){
// if(data[i]>data[j])
// times++;
// }
// }
// return times%1000000007;
// }
// };
int mod=1000000007;
int mergeSort(int left,int right,vector<int>&data,vector<int>&temp){
if(left>=right)
return 0;
int mid=(left+right)/2;
int res=mergeSort(left, mid, data, temp)+mergeSort(mid+1, right, data, temp);
res%=mod;
int i=left,j=mid+1;
for(int k=left;k<=right;k++)
temp[k]=data[k];
for(int k=left;k<=right;k++){
if(i==mid+1)
data[k]=temp[j++];
else if (j==right+1||temp[i]<=temp[j])
data[k]=temp[i++];
else{
data[k]=temp[j++];
res+=mid-i+1;
}
}
return res%mod;
}
class Solution {
public:
int InversePairs(vector<int> data) {
int n=data.size();
vector<int >res(data.size());
return mergeSort(0,n-1,data,res);
}
};
题目3(旋转数组的最小数字)
收获
1:因为基本数组还是有序的,只需要找到旋转后的那个最小节点就好了,采用二分排序的类似思想,我们是要找到最小的值的,如果进行比较的时候是采用中间值和有边界去比较的话,如果中间值比较大的话则修订left为右边值,如果中间值等于右边值的话需要考虑等值的情况也不一定是一定是相同的位置,所以判断不出来将右边值–;如果中间值小的话,那么就修改right为中间值,进行靠拢!
代码
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int right=rotateArray.size()-1;
int left=0;
while(left<right){
int mid=(right+left)/2;
if(rotateArray[mid]>rotateArray[right])
left=mid+1;
//无法判断,一个一个试
else if(rotateArray[mid]==rotateArray[right])
right--;
//最小数字要么是mid要么在mid左边
else
right=mid;
}
return rotateArray[left];
}
};
题目4(比较版本号)
收获
1:最开始当的想法是先将每一段存起来再顺次比较,然后突然发现原来可以不同存直接对二者进行比较,一个while循环就能解决问题真的学到了学到了!
代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 比较版本号
* @param version1 string字符串
* @param version2 string字符串
* @return int整型
*/
int compare(string version1, string version2) {
// write code here
int n1=version1.size();
int n2=version2.size();
int i=0,j=0;
while(i<n1||j<n2){
int num1=0;
while(i<n1&&version1[i]!='.'){
num1=num1*10+(version1[i]-'0');
i++;
}
i++;
int num2=0;
while(j<n2&&version2[j]!='.'){
num2=num2*10+(version2[j]-'0');
j++;
}
j++;
if(num1>num2)
return 1;
if(num1<num2)
return -1;
}
return 0;
}
};