- 1512
对一个数组,如果i<j && nums[i] == nums[j]
计数+1
class Solution {
public:
/**
实际上只需要关注相等的数
*/
int numIdenticalPairs(vector<int>& nums) {
sort(nums.begin(), nums.end()) ;
int sum=0;
int i=0, j=0;
while(i < nums.size()){
int cnt=0;
while(j < nums.size() && nums[j] == nums[i]){
cnt++;
j++;
}
i = j;
sum += cnt * (cnt-1) / 2;
}
return sum;
}
};
class Solution {
public:
/**
根据题目限定,可以不排序
*/
int count[101];
int numIdenticalPairs(vector<int>& nums) {
int sum=0;
for(int i=0; i<nums.size(); i++)
sum += (count[nums[i]]++);
return sum;
}
};
- 1365
对一个数组,计算数组中比当前元素小的元素个数
class Solution {
public:
int cnt[101];
int dp[101];
vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
for(int i=0; i<nums.size(); i++){
cnt[nums[i]]++;
}
for(int i=1; i<101; i++){
dp[i] = dp[i-1] + cnt[i-1];
}
for(int i=0; i<nums.size(); i++){
nums[i] = dp[nums[i]];
}
return nums;
}
};
- 665
只修改一次 能否使一个数组成为非递减数组
class Solution {
public:
/**
对于发生递减的两个数,需要删除的数可能是其中之一
比如 3 (4 3) 5 6 需要去掉前一个4
比如 3 (5 4) 5 6 需要去掉后一个4
*/
bool checkPossibility(vector<int>& nums) {
bool flag = false;
for(int i=0; i<nums.size()-1; i++){
if(nums[i] > nums[i+1]){
if(flag) return false;
bool pre = true, tail = true;
if(i > 0 && nums[i-1] > nums[i+1])
pre = false;
if(i+1 < nums.size()-1 && nums[i] > nums[i+2])
tail = false;
if(pre || tail) flag = true;
else return false;
}
}
return true;
}
};
改进:当往前找不到一个数组成三个数,总能删去一个数使之非递减,往后同理
- 1089
数组长度不变,复制数组中出现的0并插入其后
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
/*统计出现的零的个数*/
int zeros = 0;
for(int i=0; i<arr.size(); i++){
if(arr[i] == 0) zeros++;
}
/*i指向原本数组,j指向新的数组,i指向0,j能写的话就写两遍*/
for(int i=arr.size()-1, j = i+zeros; i>-1; i--, j--){
if(arr[i] == 0) {
if(j<arr.size()) arr[j] = arr[i];
j--;
if(j<arr.size()) arr[j] = arr[i];
}else{
if(j<arr.size()) arr[j] = arr[i];
}
}
}
};
- 1539
找到第k个缺失的整数,数组严格单调递增
class Solution {
public:
/**
一个数组,假设下标从1开始,第i个数如果是x(x>i),说明之前少了x-i个数。比如
1 2 4
第3个数是4,说明之前少了4-3=1个数
只要找到最大的i使得第i个数之前缺失了j个数满足j<k,i+k就是第k个缺失的数 迷惑,为啥
*/
int findKthPositive(vector<int>& arr, int k) {
int l=0, r=arr.size();
while(l<r){
int mid = (l+r) >> 1;
if(arr[mid]-mid-1 < k)
l=mid+1;
else
r=mid;
}
return l+k;
}
};
PREVIOUSLeetcode - 双指针
NEXTLeetcode - 树