BM18 二维数组中的查找
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row=array.size();
if(row==0||array[0].size()==0) return false;
for(int i=0;i<row;i++){
int right=array[0].size();
int left=0;
int mid=(right+left)/2;
while(left<=right){
if(array[i][mid]==target){
return true;
}else if(array[i][mid]>target){
right=mid-1;
mid=(left+right)/2;
}else{
left=mid+1;
mid=(left+right)/2;
}
}
}
return false;
}
};
BM19 寻找峰值
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int findPeakElement(vector<int>& nums) {
// write code here
for(int i=1;i<nums.size();i++){
if(nums[i-1]>nums[i]||nums[i-1]==nums[i]){
return i-1;
}
}
return nums.size()-1;
}
};
BM20 数组中的逆序对
归并排序的思路:在归并排序过程中会将数组划分成最小2个元素的子数组,然后一次比较子数组的长度,这里我们也可以用相同的方法统计逆序对。
- 划分阶段:将待划分区间从重点划分为两部分;
- 排序阶段:使用归并排序递归处理子序列,同时统计逆序对;
- 合并阶段:将拍好序的子序列合并;
因为在归并排序中,右边大于左边时,它大于了左边的所有子序列,基于这个性质我们可以不用每次加1来统计,减少运算次数。
class Solution {
public:
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;
}
int InversePairs(vector<int> data) {
int n = data.size();
vector<int> res(n);
return mergeSort(0, n - 1, data, res);
}
};
BM21 旋转数组的最小数字
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
sort(rotateArray.begin(),rotateArray.end());
return rotateArray[0];
}
};
BM22 比较版本号
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 比较版本号
* @param version1 string字符串
* @param version2 string字符串
* @return int整型
*/
int compare(string version1, string version2) {
// write code here
int i=0,j=0,len1=version1.size(),len2=version2.size();
while(true){
long long pa=0,pb=0;
while(i<len1){
if(version1[i]=='.'){
i++;
break;
}else{
pa=pa*10+version1[i]-'0';
}
i++;
}
while(j<len2){
if(version2[j]=='.'){
j++;
break;
}else{
pb=pb*10+version2[j]-'0';
}
j++;
}
if(pa>pb) return 1;
if(pa<pb) return -1;
if(i==len1&&j==len2) return 0;
}
}
};
- 本文链接:https://archer-lan.github.io/2022/03/16/%E7%89%9B%E5%AE%A2%E5%88%B7%E9%A2%98-DAY3/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。