给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
输入例子1:
3 4 1 2
输出例子1:
24
思路:因为结果一定是三个正数之积,或者两个负数一个正数之积,或者0。一开始想用两个优先队列,一个为大根堆,保存最多两个最小的负数,一个小根堆,保存最多三个正数。但优先队列的取值没有数组方便,选择用vector容器,代码见下
int maxmul() {
int n;
cin >> n;
if(n < 3) return -1;
//priority_queue, greater > q1;
//priority_queue, less >q2;
vector pos;
vector neg;
while(n--) {
int tmp;
cin >> tmp;
if(tmp < 0) {
sort(neg.begin(), neg.end, greater());
if(neg.size() < 2) neg.push_back(tmp);
else if(tmp < neg[0]) neg[0] = tmp;
}
else if(tmp > 0) {
sort(pos.begin(), pos.end());
if(pos.size() < 3) pos.push_back(tmp);
else if(tmp > pos[0]) pos[0] = tmp;
}
}
//if(pos.size() + neg.size() < 3) return 0;
int a = pos.size() == 3 ? pos[0] * pos[1] * pos[2] : 0;
int b = (neg.size() == 2 && !pos.empty()) ? pos.back() * neg[0] * neg[1] : 0;
return max(a, b);
}

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述:
空格分隔的两个字符串,代表输入的两个大整数
输出描述:
输入的乘积,用字符串表示
输入例子1:
72106547548473106236 982161082972751393
输出例子1:
70820244829634538040848656466105986748
leetcode第43题 原题~
六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i] (即w[j]>=h[i]),他才会上去表演节目。老师的目标是将巧克力分发给孩子们,使得最多的小孩上台表演。可以保证每个w[i]> 0且不能将多块巧克力分给一个孩子或将一块分给多个孩子。
输入描述:
第一行:n,表示h数组元素个数
第二行:n个h数组元素
第三行:m,表示w数组元素个数
第四行:m个w数组元素
输出描述:
上台表演学生人数
输入例子1:
3
2 2 3
2
3 1
输出例子1:
1
排序,贪心
int choose(int n, vector h, int m, vector w) {
int n = 0, m = 0;
cin >> n;
vector h(n, 0);
for(int i = 0; i < n; i++) cin >> h[i];
cin >> m;
vector w(m, 0);
for(int i = 0; i < m; i++) cin >> w[i];
sort(h.begin(), h.end(), greater());
sort(w.begin(), w.end(), greater());
int count = 0, i = 0, j = 0, len1 = h.size(), len2 = w.size();
while(i < len1 && j < len2) {
while(i < len1 && j < len2 && w[j] >= h[i]) {
j++, i++, count++;
}
i++;
}
return count;
}
假设一个探险家被困在了地底的迷宫之中,要从当前位置开始找到一条通往迷宫出口的路径。迷宫可以用一个二维矩阵组成,有的部分是墙,有的部分是路。迷宫之中有的路上还有门,每扇门都在迷宫的某个地方有与之匹配的钥匙,只有先拿到钥匙才能打开门。请设计一个算法,帮助探险家找到脱困的最短路径。如前所述,迷宫是通过一个二维矩阵表示的,每个元素的值的含义如下 0-墙,1-路,2-探险家的起始位置,3-迷宫的出口,大写字母-门,小写字母-对应大写字母所代表的门的钥匙
输入描述:
迷宫的地图,用二维矩阵表示。第一行是表示矩阵的行数和列数M和N
后面的M行是矩阵的数据,每一行对应与矩阵的一行(中间没有空格)。M和N都不超过100, 门不超过10扇。
输出描述:
路径的长度,是一个整数
输入例子1:
5 5
02111
01a0A
01003
01001
01111
输出例子1:
7
bool fingpath(vector> matrix, vector> &visited, vector &key,int i, int j, int &len) {
int m = matrix.size(), n = matrix[0].size();
if(i < 0 || j < 0 || i >= m || j >= n || visited[i][j] || matrix[i][j] == '0') return false;
if(matrix[i][j] == '3') return true;
if(matrix[i][j] >= 'a' && matrix[i][j] <= 'z') key.push_back(matrix[i][j]);
int k = -1;
if(matrix[i][j] >= 'A' && matrix[i][j] <= 'Z') {
for(k = 0; k < key.size(); k++)
if(key[k] - 'a' == matrix[i][j] - 'A') {
key.erase(key.begin() + k);
break;
}
}
if(k == key.size()) return false;
len++;
visited[i][j] = true;
bool b1 = fingpath(matrix, visited, key, i+1, j, len);
bool b2 = fingpath(matrix, visited, key, i-1, j, len);
bool b3 = fingpath(matrix, visited, key, i, j+1, len);
bool b4 = fingpath(matrix, visited, key, i, j-1, len);
len--;
return b1 || b2 || b3 || b4;
}
int pathlen(vector> matrix) {
int m = matrix.size(), n = matrix[0].size();
int i, j;
for(i = 0; i < m; i++) {
for(j = 0; j < n; j++)
if(matrix[i][j] == 2) break;
}
int len = 0;
vector> visited(m, vector(n, false));
visited[i][j] = true;
vector key;
findpath(matrix, visited, key, i, j, len);
return len;
}