且歌且行,眉目轻盈。何妨吟啸且|

胖柚の工作室

园龄:2年1个月粉丝:2关注:15

2024-08-10 20:57阅读: 5评论: 0推荐: 0

找出与数组相加的整数Ⅰ&Ⅱ

3131.找出与数组相加的整数Ⅰ

数组长度相等,元素一一对应。题目又保证答案一定存在,只需将两个数组从小到大排序,元素之差一定相等。所以只需求一组元素之差即可。不妨取两个数组的最小值之差。因此无需排序。

class Solution {
public:
int addedInteger(vector<int>& nums1, vector<int>& nums2) {
int m = *min_element(nums1.begin(), nums1.end()), n = *min_element(nums2.begin(), nums2.end());
return n - m;
}
};

3132.找出与数组相加的整数Ⅱ

将两个数组从小到大排序,由于只移除两个元素,nums1 的前三个元素必有保留下来的,可以枚举是保留的哪个元素,然后看 nums2 是否是改变后的 nums1子序列即可。

如何判断子序列?——同向双指针 值得学习的 trick

判断 st 的子序列

class Solution {
public:
bool isSubsequence(string s, string t) {
if (s == "") return true;
int i = 0;
for (auto c : t) {
if (c == s[i] && ++i == s.size()) return true;
}
return false;
}
};

代码实现时,可以先判断保留下来的最小元素是 nums1[2],再判断是 nums1[1],最后判断是 nums1[0]。这是因为 nums1[i] 越大,答案 x 越小,第一个满足的就是答案。此外,由于题目保证答案一定存在,所以当 nums1[2]nums1[1] 都不满足时,直接返回 nums1[0]nums1[0],无需判断。

class Solution {
public:
int minimumAddedInteger(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
for (int i = 2; i >= 1; i--) {
int delta = nums2[0] - nums1[i];
int j = 0;
for (int k = i; k < nums1.size(); k++) {
if (nums1[k] + delta == nums2[j] && ++j == nums2.size()) return delta;
}
}
return nums2[0] - nums1[0];
}
};

本文作者:胖柚の工作室

本文链接:https://www.cnblogs.com/pangyou3s/p/18352775

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   胖柚の工作室  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起