给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

我的解答:

class Solution {public int[] twoSum(int[] nums, int target) {int length = nums.length;//i j  首位两个数字for (int i = 0 ,j = length -1;i < j ;i++,j--){if (nums[i] + nums[j] == target) {return new int[]{i,j};}// k 是i 后面的一位for (int k = i +1; k < j; k++){//  如果满足条件  返回   否则k 移动if (nums[i] + nums[k] == target){return new int[]{i,k};}else if (nums[j] + nums[k] == target){return new int[]{k,j};}}// 全都不满足条件  ij 移动}return null;}
}

网上最快的解答:

class Solution {int size = 2048;int[] map = new int[size];int length = 2047;int index;public int[] twoSum(int[] nums, int target) {for (int i = 0; i < nums.length; i++) {index = nums[i]&length; //if (map[index] != 0) {return new int[] { map[index] - 1, i };} else {map[(target - index)&length ] = i + 1;}}throw new IllegalArgumentException("No two sum solution");}
}

这个算法我看了大概三天(因为我还要工作,没有大块的时间去研究),花了图,转换成二进制,才终于明白作者的大概意思。
当然,同时也看出了这个算法的漏洞。
比如:

twoSum(new int[]{2047,0, 800001, 800000, 7,2,2048}, 4095);

返回的结果是[0,1],第0个元素和第一个元素,相加显然不等于4095.

作者大概的执行思路是:

1100 0011 0101 0000 0000  800000  num[i] 111 1111 1111   2047  length101 0000 0000   1280   index1 1000 0110 1010 0000 0000    target 1600000    101 0000 0000  index
1 1000 0110 0101 0000 0000   target -index111 1111 1111   2047  length101 0000 0000

补充:2047 二进制是11111111111 (11个1)

首先取出一个数,然后让这个数num[i]&2047 = a

之后取判断map[a]是不是0(存不存在),如果不是0(存在的话)就直接返回这个数的索引,和存在的map 里面的索引。

如果不存在,就让target - num[i] ,然后&2047(11个1)。

漏洞分析:

在作者的思想里,11位就可以确定一个数字,同时也认为,target 减去这个数之后的11 也可以确定是一个数。其实是错误的。23位到11这区间的数据,作者没有关心。这算法从这里看就是有漏洞的。我们就从23位到11位之间做文章,就可以得到这个算法的漏洞。

比如在做着的算法里,0 和2048(100000000000) 是一个数字 因为,最后11位都是0. 根据这个漏洞去反推作者的算法。
目标数 1111 1111 1111 (4095)
我找的数组的第一个数是 111 1111 1111 (2047)
1111 1111 1111 (4095) - 111 1111 1111 (2047) = 100000000000
然后和11111111111 做& 运算之后的数字是0
这时候如果第二个数字是0,就直接返回了0 和 2048,根本不是target 4095

比如

twoSum(new int[]{2047,0, 800001, 800000, 7,2,2048}, 4095);

这个结果应该是0,6, 但是按照网上最快的,返回是0,1。
是因为:
首先,第一个数2047是
111111111111(11个1) & 2047 等于 2047(11个1)

然后targe(4095 ) - 2047 相当于 111111111111(12个) - 11111111111(11个1) = 100000000000 (应该是2048)

然后把这个数100000000000 (2048) & 2047 = 0

然后把map[0] = 1

到第二个数的时候,0 & 2047 = 0 ,发现这个数存在,就取出来返回。结果两个数之后是2047 ,根本不是我想要的4095

算法---------两数之和相关推荐

  1. leetcode算法—两数之和 Two Sum

    关注微信公众号:CodingTechWork,一起学习进步. 题目 Two Sum: Given an array of integers, return indices of the two num ...

  2. 算法-----两数之和 II - 输入有序数组

    题目 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值.numbers ...

  3. 常考数据结构与算法:两数之和

    题目描述 给出一个整数数组,请在数组中找出两个加起来等于目标值的数, 你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2..注意 ...

  4. 算法----两数之和

    题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数 ...

  5. php算法两数之和 复杂度,每天一道leetcode算法题:两数之和-php版

    我们先来看题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用 ...

  6. 【每日一算法】两数之和 IV - 输入 BST

    微信改版,加星标不迷路! 每日一算法-两数之和IV-输入BST 作者:阿广 阅读目录 1 题目 2 解析 1 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目 ...

  7. 【算法】哈希表 ( 两数之和 )

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  8. 【leetcode】 算法题1 两数之和

    [leetcode] 算法题1 两数之和 问题   给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...

  9. 双指针算法(三):力扣【167.两数之和 | 经典例题

    本文将讲述双指针算法的一个经典例题,167.两数之和 [题目描述] 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长 ...

最新文章

  1. Ubuntu下安装Cppcheck源码操作步骤
  2. Leetcode题解(20)
  3. row间距 table 某一行_UITableview的一个section下的各行Row之间可以设置间隔一段距离吗?...
  4. 文通表格识别系统是表格数据录入的好帮手
  5. shell 脚本比较字符串相等_LINUX快速入门第十六章:Shell 流程控制
  6. vim 删除多行_Vim 可视化模式入门
  7. 大文件上传组件集成说明
  8. 自定义xadmin后台首页
  9. 在肉鸡上构建一个完美的虚拟主机
  10. Ubuntu 下启用trackPoint
  11. 父元素上是mousedown.prevent,子元素会被携带方法,还阻止不了怎么办?
  12. 4. 多重建模-不同视角
  13. 东师19年春计算机在线作业,东师算法分析与设计20春在线作业1【标准答案】
  14. AWS免费套餐服务器部署NETCORE网站
  15. go linux下进程守护,Linux系统进程管理-Go语言中文社区
  16. 一个女程序员眼中的程序员
  17. python -- 计算 平方,乘方,平方根
  18. 【Python异常】 NPM创建Vue项目遇到ERROR command failed: npm install --loglevel error
  19. macOS如何重装系统
  20. 高级服务框架(黑马)

热门文章

  1. 【最新版】Win10 Java jdk14.0.2安装及环境变量配置
  2. linux ext4 img解包打包教程,解打包.img.ext4(转)
  3. 要了薪资证明了录取的几率大吗_空乘专业的录取分数线是多少?
  4. MFC中UPD通信详细解说
  5. serv-u 自定义html,Serv-U架设教程_Serv-U使用教程图文版
  6. laravel mysql sum查询并排行_必看!PHP常见面试题——MySQL篇(二)
  7. HDFS块文件和存放目录的关系
  8. 用Lean Pilots推动改进
  9. java对象的强引用,软引用,弱引用和虚引用
  10. android项目中记录ListView滚动停止位置与设置显示位置