二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row=array.size();
if(row==0) return false;
int col=array[0].size();
if(col==0) return false;
int i=0,j=col-1;
if(target<array[0][0] || target>array[row-1][col-1]) return false;
while(i<row && j>=0){
if(target<array[i][j]) j--;
else if(target>array[i][j]) i++;
else return true;
}
return false;
}
};
数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
int i=0;
while(i<length){
if(numbers[i]==i) i++;
else{
int tmp=numbers[numbers[i]];
if(tmp==numbers[i]){
*duplication=tmp;
return true;
}else{
numbers[numbers[i]]=numbers[i];
numbers[i]=tmp;
}
}
}
return false;
}
};
构建乘积数组
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。
- 从后往前,从前往后。
class Solution {
public:
vector<int> multiply(const vector<int>& A) {
int size=A.size();
vector<int> B(size);
/*
B[0]=1;
B[1]=A[0];
B[2]=A[0]*A[1];
B[3]=A[0]*A[1]*A[2]
......
B[size-1]=A[0]*A[1]*...*A[size-2]
*/
B[0]=1;
for(int i=1;i<size;i++){
B[i]=B[i-1]*A[i-1];
}
/*
B[0]=B[0]*A[1]*A[2]*...*A[size-1];
B[1]=B[1]*A[2]*A[3]*...*A[size-1];
B[2]=B[2]*A[3]*A[4]*...*A[size-1];
......
B[size-1]=B[size-1]*1;
*/
int tmp=1;
for(int i=size-1;i>=0;i--){
B[i]=B[i]*tmp;
tmp=tmp*A[i];
}
return B;
}
};