1.三个数的最大乘积
解题思路:并查集解法
class disjointSet{
public:
map<int, int> parent, rank;
int find(int x){
if(!parent.count(x)){
parent[x] = x;
rank[x] = 1;
}
if(parent[x] != x){
parent[x] = find(parent[x]);
}
return parent[x];
}
int merge(int x, int y){
int x_root = find(x);
int y_root = find(y);
if(x_root == y_root) return 0;
else{
if(rank[x_root] < rank[y_root]){
swap(x_root, y_root);
}
parent[y_root] = x_root;
if(rank[x_root] == rank[y_root]){
rank[x_root]++;
}
return 1;
}
}
};
class Solution {
public:
int maximumProduct(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
return max(nums[0] * nums[1] * nums[n-1], nums[n-1] * nums[n-2] * nums[n-3]);
}
};
2. 有多少小于当前的数字
解题思路:这题没说的,直接暴力就完事了
class Solution {
public:
vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
vector<int> ret;
int n = nums.size();
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int j = 0; j < n; j++) {
if (nums[j] < nums[i]) {
cnt++;
}
}
ret.push_back(cnt);
}
return ret;
}
};
3.使数组唯一的最小增量
class Solution {
public int minIncrementForUnique(int[] nums) {
int[] count = new int[80000];
for (int x : nums) {
count[x]++;
}
int ans = 0, taken = 0;
for (int x = 0; x < 80000; ++x) {
if (count[x] >= 2) {
taken += count[x] - 1;
ans -= x * (count[x] - 1);
} else if (taken > 0 && count[x] == 0) {
taken--;
ans += x;
}
}
return ans;
}
}