数组(9-11)
数组(9-11)
二维数组中的查找
思路:抓住左下角的数,比它大就往右,比它小就往上(之后的每一个数都是这样)知道超出了数组边界
步骤:
1.先求出数组的场和宽(便于定位左下角的元素以及判断边界)
2.从左下角的元素开始遍历,比它大就往右,比它小就往上,相等就是找到了,返回1
3.判断边界,超出边界了则是没有找到,返回0
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int m=array.size();
int n=array[0].size();
int i=m-1;
int j=0;
while(i>=0&&j<n)
{
if(array[i][j]<target)
j++;
else if(array[i][j]>target)
i--;
else return 1;
}
return 0;
}
};把数组排成最小的数
思路:关键在于若a+b>b+a,则把b放在前面(考虑一下定义仿函数,用sort算法进行自定义排序)
sort算法中可以利用仿函数自己定义排序规则
class myCompare
{
public:
bool operator()(const string& str1, const string& str2)
{
return str1 + str2 < str2 + str1;
}
};
class Solution {
public:
string PrintMinNumber(vector<int> numbers)
{
vector<string> str_numbers;
string str = "";
for (int i = 0; i < numbers.size(); i++)
{
str_numbers.push_back(to_string(numbers[i]));
}
sort(str_numbers.begin(), str_numbers.end(), myCompare());
for (int i = 0; i < numbers.size(); i++)
{
str += str_numbers[i];
}
return str;
}
};数组中的逆序对
思路1(暴力求解):对于数组中的每一个元素依次找它后面比它大的元素,统计个数
这种方法的时间复杂度是O(n2),只AC了50%
可以考虑一下归并排序的思路进行改进
class Solution {
public:
int InversePairs(vector<int> data) {
int len = data.size();
int count = 0;
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
if (data[i] > data[j])
count++;
}
}
return count%1000000007;
}
};加上下面这句,AC了75%
class Solution {
public:
int InversePairs(vector<int> data) {
int len = data.size();
int count = 0;
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
if (data[i] > data[j])
count++;
}
if(count>1000000007)
count%=1000000007;
}
if(count>1000000007)
count%=1000000007;
return count;
}
};思路2:采用归并排序的变法,在Merge过程中,数后面有几个元素比它大(一开始也只有50%,后来加了count%1000000007变为了75,再加一个变成100%)不知道什么原因,可能是数字太大,在函数传递过程中会发生错误,所以需要在函数中把它进行取余。但是在暴力求解中没法100%
class Solution {
public:
int InversePairs(vector<int> data) {
if(data.size()<2)
return 0;
int l=0;
int r=data.size()-1;
int count=process(data,l,r);
//if(count>=1000000007)
// count=count%1000000007;这句加不加无所谓
return count;
}
public:
int process(vector<int> &data,int l,int r)
{
if(l==r)
return 0;
int m=(l+r)/2;
int count=process(data,l,m)+process(data,m+1,r)+merge(data,l,m,r);
if(count>=1000000007)
count=count%1000000007;//不加这句75%
return count;
}
int merge(vector<int> &data,int l,int m,int r)
{
vector<int> v;
int count=0;
int i=l;
int j=m+1;
while(i<=m&&j<=r)
{
if(data[i]>data[j])
{
v.push_back(data[i]);
count+=r-j+1;
if(count>=1000000007)
count=count%1000000007;//不加这句50%
i++;
}
else
{
v.push_back(data[j]);
j++;
}
}
while(i<=m)
{
v.push_back(data[i++]);
}
while(j<=r)
{
v.push_back(data[j++]);
}
for(i=0;i<v.size();i++)
{
data[l+i]=v[i];
}
return count;
}
};

