给定一个含n个整数的数组A,请找到数组中从未出现过的最小正整数 C++
时间: 2024-03-14 08:46:50 浏览: 79
好的,这是一个常见的算法问题,以下是该算法的C++代码实现:
```c++
int findSmallestPositiveInteger(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] <= 0 || nums[i] > n) {
nums[i] = 1;
}
}
for (int i = 0; i < n; i++) {
int index = abs(nums[i]) - 1;
if (nums[index] > 0) {
nums[index] = -nums[index];
}
}
for (int i = 0; i < n; i++) {
if (nums[i] > 0) {
return i + 1;
}
}
return n + 1;
}
```
注意,这个算法的时间复杂度为O(n),空间复杂度为O(1)。
另外,这里用了STL中的vector容器,需要在头文件中添加 #include <vector>。
相关问题
利用c++实现以下代码并输出:给定一个含个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4.
要找到一个整数数组中未出现的最小正整数,可以使用哈希集合(unordered_set)来跟踪已经出现过的数字。遍历数组的同时将每个元素添加到哈希集合中。然后,从1开始遍历,检查每个正整数是否在集合中,如果没有就在结果中返回。
以下是使用C++实现这个算法的代码:
```cpp
#include <iostream>
#include <vector>
#include <unordered_set>
int findMissingPositiveNumber(std::vector<int>& nums) {
std::unordered_set<int> seen;
// 遍历数组并移除负数和0
for (int num : nums) {
if (num > 0) {
seen.insert(num);
}
}
int i = 1;
while (seen.find(i) == seen.end()) { // 当i不在集合中时,找到了缺失的正整数
return i++;
}
// 如果数组包含所有正整数直到某个点,那么下一个缺失的就是它们的最大值加一
return *std::max_element(nums.begin(), nums.end()) + 1;
}
int main() {
std::vector<int> nums = {-5, 3, 2, 3};
int missingNum = findMissingPositiveNumber(nums);
std::cout << "The missing positive number is: " << missingNum << std::endl;
return 0;
}
```
当运行此代码,对于输入数组{-5, 3, 2, 3},它将输出1,因为1是未出现的最小正整数。
给定一个含个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。给出完整能运行的c++代码。例如,数组{-5,3,2,3}中未出现的最小正整数是1;数组{1,2,3}中未出现的最小正整数是4.
为了找到一个整数数组中未出现的最小正整数,可以使用哈希集合(unordered_set)的数据结构。这个数据结构提供常数时间复杂度的查找和插入操作,非常适合这样的场景。以下是用C++实现的一个高效算法:
```cpp
#include <iostream>
#include <unordered_set>
int findMissingPositive(const std::vector<int>& nums) {
std::unordered_set<int> hashSet;
int n = nums.size();
for (int i = 0; i < n; ++i) {
if (nums[i] > 0 && nums[i] <= n) {
// 如果元素在合法范围内,则从列表中移除
hashSet.erase(nums[i]);
}
}
// 从1开始检查,因为这是第一个可能出现的正整数
for (int i = 1; ; ++i) {
// 如果不在集合中,返回该数字
if (hashSet.count(i) == 0) {
return i;
}
}
}
int main() {
std::vector<int> nums = {-5, 3, 2, 3};
std::cout << "未出现的最小正整数是: " << findMissingPositive(nums) << std::endl;
nums = {1, 2, 3};
std::cout << "未出现的最小正整数是: " << findMissingPositive(nums) << std endl;
return 0;
}
```
在这个算法中,首先遍历输入数组,将范围内的正整数从哈希集合中移除。然后,从1开始逐个检查剩余的正整数是否出现在集合中,找到的第一个不在集合中的数就是我们要找的未出现的最小正整数。
阅读全文
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)