0%

220212刷题

6355. 统计公平数对的数目

给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lowerupper ,返回 公平数对的数目

如果 (i, j) 数对满足以下情况,则认为它是一个 公平数对

  • 0 <= i < j < n,且
  • lower <= nums[i] + nums[j] <= upper

示例 1:

输入:nums = [0,1,7,4,4,5], lower = 3, upper = 6
输出:6
解释:共计 6 个公平数对:(0,3)、(0,4)、(0,5)、(1,3)、(1,4) 和 (1,5) 。

示例 2:

输入:nums = [1,7,9,2,5], lower = 11, upper = 11
输出:1
解释:只有单个公平数对:(2,3) 。

提示:

  • 1 <= nums.length <= 105
  • nums.length == n
  • -109 <= nums[i] <= 109
  • -109 <= lower <= upper <= 109

C++

class Solution {
public:
long long countFairPairs(vector<int>& nums, int lower, int upper) {
long long res = 0;
sort(nums.begin(), nums.end());
// [0,1,4,4,5,7] 3 6. 对0来说,选择4,4,5都可以 共3种
for (auto it = nums.begin(); it != nums.end(); ++it) {
int minNum = lower - *it; // 3
int maxNum = upper - *it; // 6
auto x = lower_bound(it + 1, nums.end(), minNum); // 在[1,4,4,5,7] 中返回第一个>= 3的
auto y = upper_bound(it + 1, nums.end(), maxNum); // 在[4,5,7]中返回第一个 >6 的
res += y - x; //两迭代器相减返回距离差为int
}
return res;
}
};

93. 复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" "192.168.1.1"有效 IP 地址,但是 "0.011.255.245""192.168.1.312""192.168@1.1"无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

提示:

  • 1 <= s.length <= 20
  • s 仅由数字组成

C++

  • 回溯

image-20230212160351747

class Solution {
public:
vector<string> res;
string str = "";
void backtracking(string s, int idx, int cnt){
if(cnt == 4 || idx == s.size() ){
if(cnt == 4 && idx ==s.size())
res.push_back(str.substr(0,str.size()-1));
return;
}
for(int i = 1; i <= 3; i ++){ // i是每次取substr的长度
if(s[idx] == '0' && i > 1) return;
// 一定要加 i == 3, 不然“31” > "255"直接就返回了
if(i == 3 && s.substr(idx,i) > "255") return;
if(idx + i > s.size()) return;

str += s.substr(idx,i);
str += ".";
backtracking(s, idx + i, cnt + 1);
//回撤 把 s.substr(idx,i) 和 '.' 清掉
str = str.substr(0, str.size() - 1 - i);
}
}

vector<string> restoreIpAddresses(string s) {
backtracking(s,0, 0);
return res;
}

};

97. 交错字符串

给定三个字符串 s1s2s3,请你帮忙验证 s3 是否是由 s1s2 交错 组成的。

两个字符串 st 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

  • s = s1 + s2 + ... + sn
  • t = t1 + t2 + ... + tm
  • |n - m| <= 1
  • 交错s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...

注意:a + b 意味着字符串 ab 连接。

示例 1:

img

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出:true

示例 2:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出:false

示例 3:

输入:s1 = "", s2 = "", s3 = ""
输出:true

提示:

  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200
  • s1s2、和 s3 都由小写英文字母组成

进阶:您能否仅使用 O(s2.length) 额外的内存空间来解决它?

C++

  • 三指针正向超时,反向不超时
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if(s3.size() != s1.size() + s2.size()) return false;
return dfs(s1, s2, s3, 0 , 0 , 0);
}

bool dfs(string s1, string s2, string s3 , int i, int j, int k){
int len1 = s1.size(), len2 = s2.size(), len3 = s3.size();
while(k < len3){
if(s3[k] == s1[i] && s3[k] == s2[j] && i < len1 && j < len2){
return dfs(s1,s2,s3,i + 1,j,k + 1)
|| dfs(s1,s2,s3,i,j + 1,k + 1);
}
else if(s3[k] == s1[i] && i < len1){
i ++;
k ++;
}
else if(s3[k] == s2[j] && j < len2){
j ++;
k ++;
}
else return false;
}
return true;
}
};


// class Solution {
// public:
// bool impl(string &s1, string &s2, string &s3, int p, int q, int m) {
// while (m >= 0) {
// if (p >= 0 && s1[p] == s3[m] && q >= 0 && s2[q] == s3[m]) {
// return impl(s1, s2, s3, p - 1, q, m - 1) ||
// impl(s1, s2, s3, p, q - 1, m - 1);
// } else if (p >= 0 && s1[p] == s3[m]) {
// p--, m--;
// } else if (q >= 0 && s2[q] == s3[m]) {
// q--, m--;
// } else {
// return false;
// }
// }
// return true;
// }

// bool isInterleave(string s1, string s2, string s3) {
// // s1 x s2 -> s3
// int p = s1.size(), q = s2.size(), m = s3.size();
// if (p + q != m) return false;
// return impl(s1, s2, s3, p - 1, q - 1, m - 1);
// }
// };

168. Excel表列名称

给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...

示例 1:

输入:columnNumber = 1
输出:"A"

示例 2:

输入:columnNumber = 28
输出:"AB"

示例 3:

输入:columnNumber = 701
输出:"ZY"

示例 4:

输入:columnNumber = 2147483647
输出:"FXSHRXW"

提示:

  • 1 <= columnNumber <= 231 - 1

C++

class Solution {
public:
string convertToTitle(int columnNumber) {
string res;
while(columnNumber > 0){
--columnNumber;
res += columnNumber % 26 + 'A';
columnNumber /= 26;
}
reverse(res.begin(), res.end());
return res;
}
};