mirror of
https://github.com/chefyuan/algorithm-base.git
synced 2024-11-24 21:08:53 +00:00
Merge pull request #36 from caibingcheng/main
[update] #3 数组篇添加C++ Code
This commit is contained in:
commit
5c7f983aab
@ -227,5 +227,37 @@ class Solution {
|
|||||||
|
|
||||||
时间复杂度 : O(logn) 空间复杂度 O(1)
|
时间复杂度 : O(logn) 空间复杂度 O(1)
|
||||||
|
|
||||||
|
C++ Code:
|
||||||
|
|
||||||
|
```C++
|
||||||
|
class Solution
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int countDigitOne(int n)
|
||||||
|
{
|
||||||
|
// 高位, 低位, 当前位
|
||||||
|
int high = n, low = 0, cur = 0;
|
||||||
|
int count = 0, num = 1;
|
||||||
|
|
||||||
|
//数字是0的时候完全没必要继续计算
|
||||||
|
while (high != 0)
|
||||||
|
{
|
||||||
|
cur = high % 10;
|
||||||
|
high /= 10;
|
||||||
|
//这里我们可以提出 high * num 因为我们发现无论为几,都含有它
|
||||||
|
if (cur == 0)
|
||||||
|
count += (high * num);
|
||||||
|
else if (cur == 1)
|
||||||
|
count += (high * num + 1 + low);
|
||||||
|
else
|
||||||
|
count += ((high + 1) * num);
|
||||||
|
//低位
|
||||||
|
low = cur * num + low;
|
||||||
|
//提前检查剩余数字, 以免溢出
|
||||||
|
if (high != 0)
|
||||||
|
num *= 10;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
@ -156,3 +156,49 @@ class Solution {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
C++ Code
|
||||||
|
|
||||||
|
```C++
|
||||||
|
class Solution
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int maxSatisfied(vector<int> &customers, vector<int> &grumpy, int minutes)
|
||||||
|
{
|
||||||
|
for_each(grumpy.begin(), grumpy.end(), [](auto &g){ g = !g; });
|
||||||
|
vector<int> osum(customers.size(), 0);
|
||||||
|
|
||||||
|
//先初始化第一个元素
|
||||||
|
osum[0] = customers[0] * grumpy[0];
|
||||||
|
//计算前缀和, osum是origin sum
|
||||||
|
for (int i = 1; i < osum.size(); i++)
|
||||||
|
{
|
||||||
|
osum[i] = osum[i - 1] + customers[i] * grumpy[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
//计算连续minutes的和
|
||||||
|
vector<int> msum(customers.size() - minutes + 1, 0);
|
||||||
|
for (int i = 0; i < minutes; i++)
|
||||||
|
{
|
||||||
|
msum[0] += customers[i];
|
||||||
|
}
|
||||||
|
for (int i = 1; i < msum.size(); i++)
|
||||||
|
{
|
||||||
|
msum[i] = msum[i - 1] - customers[i - 1] + customers[i + minutes - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//分成三段计算
|
||||||
|
int result = 0;
|
||||||
|
for (int i = 0; i < msum.size(); i++)
|
||||||
|
{
|
||||||
|
//左 中 右
|
||||||
|
//注意左的边界条件, 可以使用边界测试
|
||||||
|
int sum = ((i - 1 >= 0) ? osum[i - 1] : 0) + msum[i] + osum[osum.size() - 1] - osum[i + minutes - 1];
|
||||||
|
if (sum > result)
|
||||||
|
result = sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
@ -232,3 +232,44 @@ class Solution {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
C++ Code
|
||||||
|
|
||||||
|
```C++
|
||||||
|
class Solution
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int firstMissingPositive(vector<int> &nums)
|
||||||
|
{
|
||||||
|
int size = nums.size();
|
||||||
|
//判断范围是否符合要求
|
||||||
|
auto inRange = [](auto s, auto e)
|
||||||
|
{
|
||||||
|
return [s, e](auto &n)
|
||||||
|
{
|
||||||
|
return e >= n && n >= s;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
auto cusInRange = inRange(1, size);
|
||||||
|
//增加数组长度, 便于计算, 不需要再转换
|
||||||
|
nums.push_back(0);
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
//将不在正确位置的元素放到正确位置上
|
||||||
|
while (cusInRange(nums[i]) && nums[i] != i && nums[nums[i]] != nums[i])
|
||||||
|
{
|
||||||
|
swap(nums[i], nums[nums[i]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//找出缺失的元素
|
||||||
|
for (int i = 1; i <= size; i++)
|
||||||
|
{
|
||||||
|
if (nums[i] != i)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return size + 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
@ -177,3 +177,38 @@ class Solution {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
C++ Code
|
||||||
|
|
||||||
|
```C++
|
||||||
|
class Solution
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int findMaxConsecutiveOnes(vector<int> &nums)
|
||||||
|
{
|
||||||
|
int s = 0;
|
||||||
|
int e = 0;
|
||||||
|
int result = 0;
|
||||||
|
int size = nums.size();
|
||||||
|
|
||||||
|
while (s < size && e < size)
|
||||||
|
{
|
||||||
|
while (s < size && nums[s++] == 1)
|
||||||
|
{
|
||||||
|
e = s;
|
||||||
|
while (e < size && nums[e] == 1)
|
||||||
|
{
|
||||||
|
e++;
|
||||||
|
};
|
||||||
|
//注意需要加1, 可以使用极限条件测试
|
||||||
|
int r = e - s + 1;
|
||||||
|
if (r > result)
|
||||||
|
result = r;
|
||||||
|
s = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
@ -186,3 +186,34 @@ class Solution {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
C++ Code
|
||||||
|
|
||||||
|
```C++
|
||||||
|
class Solution
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int subarraySum(vector<int> &nums, int k)
|
||||||
|
{
|
||||||
|
unordered_map<int, int> smp;
|
||||||
|
int sum = 0;
|
||||||
|
//初始化"最外面"的0
|
||||||
|
smp[0] = 1;
|
||||||
|
int result = 0;
|
||||||
|
for(int i = 0; i < nums.size(); i++)
|
||||||
|
{
|
||||||
|
sum += nums[i];
|
||||||
|
auto mp = smp.find(sum - k);
|
||||||
|
if (mp != smp.end())
|
||||||
|
{
|
||||||
|
//map里面存的一定是在前面的元素
|
||||||
|
//可以尝试将map的value换为数组
|
||||||
|
result += mp->second;
|
||||||
|
}
|
||||||
|
smp[sum]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user