给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?
示例 1:
输入:nums = [1,2,0]
输出:3
时间复杂度:O(N),其中 N 是数组的长度。空间复杂度:O(1)。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i = 0; i < nums.size(); i++){
while(nums[i] > 0 && nums[i] <= nums.size() && nums[i] != nums[nums[i] - 1])
swap(nums[i], nums[nums[i] - 1]);
}
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] != i + 1)
return i + 1;
}
return nums.size() + 1;
}
};
参考https://labuladong.gitbook.io/algo/gao-pin-mian-shi-xi-lie/jie-yu-shui
双指针。
class Solution {
public:
int trap(vector<int>& height) {
if(height.empty())
return 0;
int l_max = height[0], r_max = height[height.size() - 1];
int left = 0, right = height.size() - 1;
int res = 0;
while(left <= right)
{
l_max = max(l_max, height[left]);
r_max = max(r_max, height[right]);
if(l_max < r_max)
{
res += l_max - height[left];
left++;
}
else
{
res += r_max - height[right];
right--;
}
}
return res;
}
};
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
https://labuladong.gitbook.io/algo/gao-pin-mian-shi-xi-lie/zi-fu-chuan-cheng-fa
class Solution {
public:
string multiply(string num1, string num2) {
int m = num1.size(), n = num2.size();
vector<int> res(m + n, 0);
for(int i = m - 1; i >= 0; i--)
for(int j = n - 1; j >= 0; j--)
{
int mul = (num1[i] - '0') * (num2[j] - '0');
int p1 = i + j, p2 = i + j + 1;
int sum = mul + res[p2];
res[p2] = sum % 10;
res[p1] += sum / 10;
}
int i = 0;
//结果前缀可能是0
while(i < res.size() && res[i] == 0)
i++;
string str;
for(; i < res.size(); i++)
str += ('0' + res[i]);
return str.size() == 0 ? "0" : str;
}
};