当前位置: 首页 > news >正文

甘肃精神文明建设网站wordpress php

甘肃精神文明建设网站,wordpress php,跨境电商怎么入行,国家城乡建设部网站首页Day07 454.四数相加II383. 赎金信15. 三数之和18. 四数之和 454.四数相加II 题目链接:454.四数相加II 寻找两个数组之和,是否与另外两个数组之和有特定的关系。 因为数值可能跨度太大,选择使用下标表示为对应的数值大小,会很浪费…

Day07

    • 454.四数相加II
    • 383. 赎金信
    • 15. 三数之和
    • 18. 四数之和

454.四数相加II

题目链接:454.四数相加II
寻找两个数组之和,是否与另外两个数组之和有特定的关系。
因为数值可能跨度太大,选择使用下标表示为对应的数值大小,会很浪费内存空间。
target减去后两个数组之和的结果,是否存在与前两个数组之和组成的集合中。又要返回满足题意的次数,因此决定使用map而不是set

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> map;for (auto& i: nums1) {for (auto& j: nums2) {map[i + j]++;//nums1 nums2之和存入map}}int cnt = 0;for (auto& i: nums3) {for (auto& j: nums4) {int target = 0 - (i + j);//查找target是否存在与map中if (map.find(target) != map.end()) {cnt += map[target];//target对应存在多少个,都加入}}}return cnt;}
};

383. 赎金信

题目链接:383. 赎金信
判断ransomNote中的字符是否出现在magazine中。

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {if (ransomNote.size() > magazine.size()) {return false;}int record['z' - 'A' + 1] = {};//个数别查错了。+1for (auto& i : magazine) {record[i - 'A']++;}for (auto& i : ransomNote) {record[i - 'A']--;//出现就直接返回,不用在该循环之后再遍历recordif (record[i - 'A'] < 0) return false;}return true;}
};

15. 三数之和

题目链接:15. 三数之和
两个数之和,第三个数与目标值运算之后,是否出现在两个数之和中。
但是,时间复杂度为 O ( n 2 ) O(n^2) O(n2),且要去重操作。
选择使用双指针,注意去重操作。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int> > ret;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i++) {if (nums[i] > 0) break;//剪枝。没有不影响结果//i指针的去重if (i > 0 && nums[i] == nums[i - 1]) continue;int left = i + 1, right = nums.size() - 1;while (left < right) {if (nums[i] + nums[left] + nums[right] > 0) {right--;} else if (nums[i] + nums[left] + nums[right] < 0) {left++;} else {ret.push_back(vector<int>{nums[i], nums[left], nums[right]});//left和right指针的去重。移动时,注意满足边界条件while (left < right && nums[left] == nums[left + 1])left++;while (left < right && nums[right] == nums[right - 1])right--;left++;right--;}}}return ret;}
};

其中

while (left < right && nums[left] == nums[left + 1]) left++;
while (left < right && nums[right] == nums[right - 1]) right--;left++;
right--;

前两行和后两行顺序不能调换。


18. 四数之和

题目链接: 18. 四数之和
三数之和再多套一个遍历。不用哈希理由三数之和。
注意剪枝条件不同于三数之和,因为三数的target是0

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;sort(nums.begin(), nums.end());//排序for (int k = 0; k < nums.size(); k++) {if (nums[k] > target && nums[k] >= 0) break;//剪枝if (k > 0 && nums[k] == nums[k - 1]) continue;//k去重for (int i = k + 1; i < nums.size(); i++) {if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) break;//剪枝。k+i是一个整体if (i > k + 1 && nums[i] == nums[i - 1]) continue;//i去重int left = i + 1, right = nums.size() - 1;while (left < right) {if ((long) nums[k] + nums[i] + nums[left] + nums[right] > target) right--;else if ((long) nums[k] + nums[i] + nums[left] + nums[right] < target) left++;else {ret.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});while (left < right && nums[left] == nums[left + 1]) left++;//left去重while (left < right && nums[right] == nums[right - 1]) right--;//right去重right--;left++;}}}}return ret;}
};
if ((long) nums[k] + nums[i] + nums[left] + nums[right] > target)

long是因为nums数组中的元素超过int范围,导致溢出了。

http://www.sczhlp.com/news/146159/

相关文章:

  • 大连 响应式网站网站建设制作公司
  • 网站项目计划书范文手机ui设计是什么
  • test2
  • test1
  • tset3
  • test4
  • 做实验流程图的网站敦煌网站外引流怎么做
  • 网站建设售后服务承诺函网站备案现场核验
  • 做分析图很好用的网站建筑网建设通网站作用
  • 如何做资金盘网站摩托车建设网站
  • 西宁专业制作网站温州seo招聘
  • html中网站最下面怎么做电脑网站拦截怎么解除
  • 微商网站开发合同思科企业网络拓扑图
  • 一级域名网站里有二级域名用jsp和mysql做网站
  • 站长 网站ipwordpress 自定义评论
  • 【Nordic随笔】
  • 电商网站 厦门2024微信最新版本下载
  • 常熟网站建设wordpress 删除仪表盘
  • 遵义官网网站建设WordPress开通用户投稿功能
  • 辽宁专业网站建设网站网络架构
  • 齐博企业网站海口网站开发制作
  • 廊坊建设公司网站php网站标题修改
  • 自助健站wordpress装修
  • 网站搭建合同模板网站流量 次
  • 企业网站建设818gx网站建设的所有权
  • 婚庆网站开发计划书单页网站如何做排名
  • 查房价的官方网站企业优化方案
  • 公司网站的开发网站设置怎么调
  • 做美直播网站昆明系统开发
  • ppt模板网站开发齐全的网站建设