242. 有效的字母异位词

242. 有效的字母异位词 - 力扣(LeetCode)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.size() != t.size()) {
return false;
}
std::map<char, size_t> ms{};
std::map<char, size_t> mt{};
for (size_t i = 0; i < s.size(); i++)
{
++ms[s[i]];
++mt[t[i]];
}
return ms == mt;
}
};

时间复杂度:O(n)
空间复杂度:O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.size() != t.size()) {
return false;
}
std::array<ssize_t, 26> count{};
for (size_t i = 0; i < s.size(); i++)
{
++count[s[i] - 'a'];
--count[t[i] - 'a'];
}
for (auto &&i : count) {
if (i != 0) {
return false;
}
}
return true;
}
};

时间复杂度:O(n)
空间复杂度:O(1)

349. 两个数组的交集

349. 两个数组的交集 - 力扣(LeetCode)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
std::unordered_set<int> us1{}, us2{};
for (auto&& i : nums1) {
us1.insert(i);
}
for (auto&& i : nums2) {
us2.insert(i);
}

const std::unordered_set<int>& small =
(us1.size() < us2.size()) ? us1 : us2;
const std::unordered_set<int>& large =
(us1.size() < us2.size()) ? us2 : us1;
std::vector<int> intersection;
for (const int& val : small) {
if (large.find(val) != large.end()) {
intersection.push_back(val);
}
}
return intersection;
}
};

时间复杂度:O(m + n)
空间复杂度:O(m + n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
std::sort(nums1.begin(), nums1.end());
std::sort(nums2.begin(), nums2.end());

std::vector<int> intersection;
size_t i{}, j{};
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] == nums2[j]) {
if (!intersection.size() || nums1[i] != intersection.back()) {
intersection.push_back(nums1[i]);
}
++i;
++j;
} else if (nums1[i] < nums2[j]) {
++i;
} else {
++j;
}
}
return intersection;
}
};

时间复杂度:O(m log m + n log n)
空间复杂度:O(log m + log n)

202. 快乐数

202. 快乐数 - 力扣(LeetCode)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
size_t get_next(int n) {
size_t output{};
while (n) {
output += (n % 10) * (n % 10);
n /= 10;
}
return output;
}
bool isHappy(int n) {
std::unordered_set<size_t> us{};
while (n != 1) {
auto ret = us.insert(n);
if (!ret.second) {
return false;
}
n = get_next(n);
}
return true;
}
};

时间复杂度:O(log n)
空间复杂度:O(log n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
size_t get_next(int n) {
size_t output{};
while (n) {
output += (n % 10) * (n % 10);
n /= 10;
}
return output;
}
bool isHappy(int n) {
int slow{n};
int fast{n};
while (fast != 1) {
slow = get_next(slow);
fast = get_next(get_next(fast));
if (fast == slow) {
break;
}
}
return fast == 1;
}
};

时间复杂度:O(log n)
空间复杂度:O(1)

1. 两数之和

1. 两数之和 - 力扣(LeetCode)

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size() - 1; ++i) {
for (int j = i + 1; j < nums.size(); ++j) {
if (nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
};

时间复杂度:O(n^2)
空间复杂度:O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int, int> um{};
for (int i = 0; i < nums.size(); ++i) {
if (um.find(target - nums[i]) != um.end()) {
return {um[target - nums[i]], i};
}
um[nums[i]] = i;
}
return {};
}
};

时间复杂度:O(n)
空间复杂度:O(n)