019/algorithm

/src/algorithm/leetcode/leetcode1142.cpp
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class Solution {
public:
// 1. 快速排序
int partition(vector<int> &nums, int l, int r) {
int pivot = nums[r];
int i = l - 1;
for (int j = l; j < r; j++) {
if (nums[j] < pivot) {
i++;
swap(nums[i], nums[j]);
}
}
swap(nums[i + 1], nums[r]);
return i + 1;
}

void quickSort(vector<int> &nums, int l, int r) {
if (l >= r) {
return;
}
int p = partition(nums, l, r);
quickSort(nums, l, p - 1);
quickSort(nums, p + 1, r);
}

vector<int> sortArray(vector<int> &nums) {
quickSort(nums, 0, nums.size() - 1);
return nums;
}
};

int main() {
vector<int> nums = {5, 2, 3, 1, 4};
Solution s;
auto ans = s.sortArray(nums);
for (int num: ans) {
cout << num << endl;
}
return 0;
}

/src/algorithm/leetcode/leetcode102.cpp
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class Solution {
public:
vector<int> findDisappearedNumbers(vector<int> &nums) {
vector<int> ans;

for (int i = 0; i < nums.size(); i++) {
while (nums[i] != i + 1 && 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) {
ans.push_back(i + 1);
}
}

return ans;
}
};

int main() {
vector<int> nums = {4, 3, 2, 7, 8, 2, 3, 1};
Solution s;
auto ans = s.findDisappearedNumbers(nums);
for (int num: ans) {
cout << num << endl;
}
return 0;
}

/src/algorithm/leetcode/leetcode218.cpp
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {
vector<int> ans;

for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
ans.push_back(i + 1);
ans.push_back(j + 1);
return ans;
}
}
}

return ans;
}
};

int main() {
vector<int> nums = {2, 7, 11, 15};
int target = 9;
Solution s;
auto ans = s.twoSum(nums, target);
for (int num: ans) {
cout << num << endl;
}
return 0;
}

/src/algorithm/leetcode/leetcode108.cpp
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class Solution {
public:
int compareVersion(string version1, string version2) {
vector<int> nums1, nums2;

int idx1 = 0;
while (idx1 < version1.size()) {
int n = version1.size();
int idx2 = idx1;
while (idx2 < n && version1[idx2] != '.') {
idx2++;
}
nums1.push_back(stoi(version1.substr(idx1, idx2 - idx1)));
idx1 = idx2 + 1;
}

int idx2 = 0;
while (idx2 < version2.size()) {
int n = version2.size();
int idx3 = idx2;
while (idx3 < n && version2[idx3] != '.') {
idx3++;
}
nums2.push_back(stoi(version2.substr(idx2, idx3 - idx2)));
idx2 = idx3 + 1;
}

while (nums1.size() < nums2.size()) {
nums1.push_back(0);
}
while (nums2.size() < nums1.size()) {
nums2.push_back(0);
}

for (int i = 0; i < nums1.size(); i++) {
if (nums1[i] > nums2[i]) {
return 1;
} else if (nums1[i] < nums2[i]) {
return -1;
}
}
return 0;
}
};

int main() {
string version1 = "1.2.1.4";
string version2 = "1.2.4.1";
Solution s;
int ans = s.compareVersion(version1, version2);
cout << ans << endl;
return 0;
}

/src/algorithm/leetcode/leetcode12.cpp
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class Solution {
public:
vector<int> findDis