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

青岛手机建站多少钱青岛多区发布最新通告

青岛手机建站多少钱,青岛多区发布最新通告,线上推广员是做什么的,申请注册一个自媒体账号目录 1.题目 2.分析 去重的代码 错误代码 3.完整代码 提交结果 1.题目 四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元…

目录

1.题目

2.分析

去重的代码

错误代码

3.完整代码

提交结果


1.题目

四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abcd 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

提示:

  • 1 <= nums.length <= 200
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9

2.分析

本题和L37.【LeetCode题解】三数之和(双指针思想)题非常像,解法也是类似的,将原暴力解法的四重循环(循环变量为i,j,k,l)的最里面的两重循环换成双指针(left和right)即可

但题目条件限制"不重复的四元组",因此需要做去重操作,这个实现的思路在L37.【LeetCode题解】三数之和(双指针思想)文章中讲过了

去重的代码

i,j,left和right都要跳过相同的元素,一定要注意i,j,left,right不能超过各自的循环范围

left++;
while (nums[left]==nums[left-1]&&left<right)left++;right--;
while (nums[right]==nums[right+1]&&left<right)right--;j++;
while (nums[j]==nums[j-1]&&j<=nums.size()-3)j++;i++;
while (nums[i]==nums[i-1]&&i<=nums.size()-4)i++;

错误代码

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {if (nums.size()<4)return {};        sort(nums.begin(),nums.end());vector<vector<int>> ret;for (int i=0;i<=nums.size()-4;){for (int j=i+1;j<=nums.size()-3;){int left=j+1;int right=nums.size()-1;while (left<right){int sum=nums[i]+nums[j]+nums[left]+nums[right];if (sum>target)right--;else if (sum<target)left++;else//sum==target{ret.push_back({nums[i],nums[j],nums[left],nums[right]});left++;while (nums[left]==nums[left-1]&&left<right)left++;right--;while (nums[right]==nums[right+1]&&left<right)right--;}}j++;while (nums[j]==nums[j-1]&&j<=nums.size()-3)j++;}i++;while (nums[i]==nums[i-1]&&i<=nums.size()-4)i++;}return ret;}
};

报错信息:

sum超出int的存储范围,因为-10^9 <= nums[i] <= 10^9,sum最大可为4\cdot 10^9

如果将int改成long long写成long long sum=nums[i]+nums[j]+nums[left]+nums[right];仍然会出错

明明已经用long long来扩大存储范围了却仍然会出错,想要找到具体原因需要看底层汇编代码的实现,查看Leetcode在线测试使用的编译器:

在What-are-the-environments-for-the-programming-languages找到了信息:

由于Leetcode的编译器为clang,可手动在Linux平台上测试,

先安装clang:

sudo apt update
sudo apt install clang

编译以下代码:

//保存为test.cpp
int  main()
{int i=1000000000;int j=1000000000;int left=1000000000;int right=1000000000;long long sum=i+j+left+right;return 0;
}

要看底层,需要看汇编代码,指令为:

clang -S test.cpp

 汇编代码为:

        .text.file   "test.cpp".globl  main                    # -- Begin function main.p2align        4, 0x90.type   main,@function
main:                                   # @main.cfi_startproc
# %bb.0:pushq   %rbp.cfi_def_cfa_offset 16.cfi_offset %rbp, -16movq    %rsp, %rbp.cfi_def_cfa_register %rbpxorl    %eax, %eaxmovl    $0, -4(%rbp)movl    $1000000000, -8(%rbp)   # imm = 0x3B9ACA00movl    $1000000000, -12(%rbp)  # imm = 0x3B9ACA00movl    $1000000000, -16(%rbp)  # imm = 0x3B9ACA00movl    $1000000000, -20(%rbp)  # imm = 0x3B9ACA00movl    -8(%rbp), %ecxaddl    -12(%rbp), %ecxaddl    -16(%rbp), %ecxaddl    -20(%rbp), %ecxmovslq  %ecx, %rdxmovq    %rdx, -32(%rbp)popq    %rbp.cfi_def_cfa %rsp, 8retq
.Lfunc_end0:.size   main, .Lfunc_end0-main.cfi_endproc# -- End function.ident  "clang version 10.0.0-4ubuntu1 ".section        ".note.GNU-stack","",@progbits.addrsig

只看重点部分:按照Intel汇编代码的风格来说,四个1000000000分别存到了[rbp-8],[rbp-12],[rbp-16],[rbp-20]的位置,之后使用3次addl指令,都做了相同的事,都是+10^9,而且都是由ecx寄存器来接收,ecx寄存器是4字节,由于int类型的最大值约为2.1\cdot 10^9,因此在相加时会超过int类型的最大值,导致溢出,最后的movslq,作用为以符号扩展传送方式,将参数从4字节扩展为8字节,4字节是int类型,8字节是long long类型,会发生类型转换

注:movslq全称moves a 32-bit quantity (longword) into a 64-bit register (quadword) with sign extension 

因此可以理解为:long long sum=i+j+left+right;的i+j+left+right先按int类型相加,最后将结果的类型转换为long long

为了解决按int类型相加时产生的溢出,可以加两次:

long long sum=nums[i]+nums[j];
sum+=nums[left]+nums[right];

(原因:nums数组的元素不会超过1\cdot 10^9,两个元素的和不会超过2\cdot 10^9,比int类型的最大值要小)

或者只加一次,强制类型转换:

long long sum=nums[i]+nums[j]+(long long)(nums[left]+nums[right]);

注意:不能使用unsigned long long,数组元素值可为负

3.完整代码

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {if (nums.size()<4)return {};        sort(nums.begin(),nums.end());vector<vector<int>> ret;for (int i=0;i<=nums.size()-4;){for (int j=i+1;j<=nums.size()-3;){int left=j+1;int right=nums.size()-1;while (left<right){long long sum=nums[i]+nums[j];sum+=nums[left]+nums[right];if (sum>target)right--;else if (sum<target)left++;else//sum==target{ret.push_back({nums[i],nums[j],nums[left],nums[right]});left++;while (nums[left]==nums[left-1]&&left<right)left++;right--;while (nums[right]==nums[right+1]&&left<right)right--;}}j++;while (nums[j]==nums[j-1]&&j<=nums.size()-3)j++;}i++;while (nums[i]==nums[i-1]&&i<=nums.size()-4)i++;}return ret;}
};

提交结果


文章转载自:

http://EyzVXeB1.khntd.cn
http://6pTs5Lut.khntd.cn
http://dujSQeac.khntd.cn
http://bYqVT2l2.khntd.cn
http://DeWuENfc.khntd.cn
http://77p1Tcwk.khntd.cn
http://u7YEE0aN.khntd.cn
http://5D0FPuyk.khntd.cn
http://aEzH4FWG.khntd.cn
http://3cP6wUG9.khntd.cn
http://wfDWNp0z.khntd.cn
http://lgehFezF.khntd.cn
http://NbT0Qw2O.khntd.cn
http://j9rshqbR.khntd.cn
http://1ClUZYGz.khntd.cn
http://lhhsVJ7g.khntd.cn
http://TkLtq3BL.khntd.cn
http://otwJMYTr.khntd.cn
http://sFVplj9s.khntd.cn
http://ARoosXp5.khntd.cn
http://a7jpbWRF.khntd.cn
http://SIX5IxZV.khntd.cn
http://YuCGFHun.khntd.cn
http://zMTZQC6n.khntd.cn
http://4xayxhVL.khntd.cn
http://C6SsEujW.khntd.cn
http://ait4YioS.khntd.cn
http://lp8B0aRK.khntd.cn
http://DDITBrLe.khntd.cn
http://ovPMtoA9.khntd.cn
http://www.dtcms.com/wzjs/699311.html

相关文章:

  • 哪里网站开发好制作相册
  • 网站备案还要买幕布医疗器械龙头股排名
  • 福建省建设执业资格注册中心网站h5开发app用什么工具好
  • .net网站开发视频视频拍摄手法有哪些
  • 电器企业网站建设关于网站备案及管理的授权书
  • 龙溪网站建设企业用asp做网站系统步骤
  • 网站优化设计方案怎么做个人网站企业备案区别
  • 保护稀有动物网站建设策划书简洁网站模板素材
  • 国外著名购物网站排名成都网站建设 平易云
  • 深圳网站设计公司费用flashfxp上传多个网站
  • 凡科建站seo灵山招聘网灵山英才网做灵山专业的招聘网站
  • 长沙建设信息网站新网站建设公司
  • 建站宝盒设置北京低价网站建设
  • 做茶叶网站的公司国际贸易电子商务网站建设流程
  • 太原做企业网站的wordpress 获得子类id
  • 制作网站需要什么知识现在什么省网站备案最快
  • 外贸平台网站建设江苏宏澄建设有限公司网站
  • 郑州同济医院收费高吗seo教程搜索引擎优化
  • 企业网站硬件设计网络规划设计师哪个机构好
  • 河北提供网站制作公司报价网站模板建站教程
  • 怎样推广网站网络营销有什么特点
  • 企业网站建设一般要素有哪些十大猎头公司排名
  • 网站关键词 html成功的网站应该具备哪些要素
  • 馆陶网站建设价格网站文章收录查询
  • 背景网站建设公司电商运营发展前景怎么样
  • 张家港做网站广告公司江门建站
  • 长沙营销网站建站公司怎么修改网站的域名
  • 做暖暖在线获取网站培训类 网站后台
  • 网站建设最低价网站文章更新
  • 重庆医院门户网站建设学校室内设计效果图