
这题的思路很简单,在读完题目之后,便可以想到暴力枚举,直接遍历整个数组两遍即可,但是时间复杂度高,下面是运行之后的结果

很简单快速的将这个题目写完了,但是有没有更高效,时间复杂度更低的方法呢? 当然! 思路:
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int, int> hash;
for(int i = 0; i < nums.size(); i++)
{
int x = target - nums[i];
if(hash.count(x)) return {hash[x], i};
hash[nums[i]] = i;
}
return {};
}
};
这个题目也是一个很经典的题目,也是一个一眼题
class Solution
{
public:
bool CheckPermutation(string s1, string s2)
{
sort(s1.begin(),s1.end());
sort(s2.begin(),s2.end());
if(s1 == s2) return true;
else return false;
}
};class Solution
{
public:
bool CheckPermutation(string s1, string s2)
{
if(s1.size() != s2.size()) return false;
int hash[26] = { 0 };
//先统计第一个字符串的信息
for(auto ch : s1)
hash[ch - 'a']++;
//扫描第二个字符串,看看能不能重排
for(auto ch : s2)
{
hash[ch - 'a']--;
if(hash[ch - 'a'] < 0) return false;
}
return true;
}
};
class Solution
{
public:
bool containsDuplicate(vector<int>& nums)
{
// 创建一个无序集合,用于存储nums向量中的唯一元素
unordered_set <int> hash;
// 遍历nums向量中的每个元素
for(auto x : nums)
{
// 如果元素已经在集合中,说明存在重复元素
if(hash.count(x))
return true; // 如果发现重复元素,返回true
else
hash.insert(x); // 如果没有重复元素,将该元素插入集合中
}
// 如果遍历完后没有发现任何重复元素,返回false
return false;
}
};
class Solution
{
public:
bool containsNearbyDuplicate(vector<int>& nums, int k)
{
// 创建一个哈希表,用于存储每个元素及其最后出现的位置
unordered_map<int, int> hash;
// 遍历nums向量中的每个元素
for(int i = 0; i < nums.size(); i++)
{
// 如果当前元素在哈希表中已经存在
if(hash.count(nums[i]))
{
// 判断当前索引与该元素上次出现索引的差是否小于等于k
if(i - hash[nums[i]] <= k)
return true; // 如果差值小于等于k,返回true,表示找到满足条件的重复元素
}
// 更新当前元素在哈希表中的位置
hash[nums[i]] = i;
}
// 如果遍历完所有元素都没有找到满足条件的重复元素,返回false
return false;
}
};
class Solution
{
public:
vector<vector<string>> groupAnagrams(vector<string>& strs)
{
// 创建一个哈希表,key是排序后的字符串,value是与该排序字符串对应的字母异位词列表
unordered_map <string, vector<string>> hash;
// 1. 将所有字符串排序并分组
for(auto& s : strs)
{
// 将字符串复制到tmp中,然后排序
string tmp = s;
sort(tmp.begin(), tmp.end());
// 根据排序后的字符串,将原始字符串加入哈希表的对应组中
hash[tmp].push_back(s);
}
// 2. 从哈希表中提取出结果
vector<vector<string>> ret;
for(auto&[x, y] : hash)
{
// 将每一组字母异位词加入到结果列表中
ret.push_back(y);
}
// 返回结果
return ret;
}
};
class Solution
{
public:
string longestCommonPrefix(vector<string>& strs)
{
// 遍历第一个字符串的每一个字符
for(int i = 0; i < strs[0].size(); i++)
{
// 获取当前字符
char tmp = strs[0][i];
// 遍历后续的字符串,检查是否在当前字符位置上与第一个字符串相同
for(int j = 1; j < strs.size(); j++)
{
// 如果某个字符串的长度小于等于i,或者字符不匹配,返回从0到i的子串作为公共前缀
if(i == strs[j].size() || tmp != strs[j][i])
return strs[0].substr(0, i);
}
}
// 如果没有遇到不匹配的情况,说明第一个字符串就是公共前缀
return strs[0];
}
};class Solution
{
public:
string longestPalindrome(string s)
{
// 获取字符串长度n
int n = s.size(), begin = 0, len = 0;
// 遍历每个字符,尝试找到以该字符为中心的回文串
for(int i = 0; i < n; i++)
{
// 处理奇数长度回文串,以字符s[i]为中心
int right = i, left = i;
// 扩展左右两边,直到不满足回文条件
while(left >= 0 && right < n && s[left] == s[right])
{
left--;
right++;
}
// 更新最长回文串的起始位置和长度
if(right - left - 1 > len)
{
begin = left + 1;
len = right - left - 1;
}
// 处理偶数长度回文串,以字符s[i]和s[i+1]为中心
right = i + 1, left = i;
while(left >= 0 && right < n && s[left] == s[right])
{
left--;
right++;
}
// 更新最长回文串的起始位置和长度
if(right - left - 1 > len)
{
begin = left + 1;
len = right - left - 1;
}
}
// 返回最长回文子串
return s.substr(begin, len);
}
};
class Solution
{
public:
string addBinary(string a, string b)
{
string ret; // 用于存储结果的字符串
int cur1 = a.size() - 1, cur2 = b.size() - 1, t = 0; // cur1, cur2分别是a和b的当前字符索引,t是进位
// 遍历两个字符串直到都遍历完并且没有进位
while(cur1 >= 0 || cur2 >= 0 || t)
{
// 如果a还有剩余位,取出a对应位置的数字并加到t中
if(cur1 >= 0) t += a[cur1--] - '0';
// 如果b还有剩余位,取出b对应位置的数字并加到t中
if(cur2 >= 0) t += b[cur2--] - '0';
// 将当前位的结果加到结果字符串中,t % 2是当前位(0或1),进位需要除以2
ret += t % 2 + '0';
t /= 2; // 更新进位,t // 2
}
// 由于我们是从低位到高位处理的,最后需要反转结果字符串
reverse(ret.begin(), ret.end());
return ret; // 返回加法结果的二进制字符串
}
};


class Solution
{
public:
string multiply(string num1, string num2)
{
// 获取两个字符串的长度
int m = num1.size(), n = num2.size();
// 反转字符串,以便从低位开始计算
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
// 临时数组用于存储每一位的乘积结果
vector<int> tmp(m + n - 1);
// 进行无进位的相乘
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
tmp[i + j] += (num1[i] - '0') * (num2[j] - '0');
// 处理进位
int cur = 0, t = 0;
string ret;
while(cur < m + n - 1 || t != 0)
{
// 将当前的乘积加到结果中
if(cur < m + n - 1) t += tmp[cur++];
// 取当前位的数字,并更新进位
ret += t % 10 + '0';
t /= 10;
}
// 处理前导零
while(ret.size() > 1 && ret.back() == '0') ret.pop_back();
// 反转最终的结果字符串
reverse(ret.begin(), ret.end());
return ret; // 返回最终的乘积结果
}
};