001LeetCode--TwoSum

今天开始学习LeetCode(重要提示:原文出处在 DERRANTCM,感谢博主大大的无私分享),这篇博文主要记录自己的学习心得,2018年了,在此祝福大家学习进步,工作顺利!

下面先给出博主原文,然后在根据博主原文衍生新题。

原题

  Given an array of integers, find two numbers such that they add up to a specific target number. 
  The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based. 
  You may assume that each input would have exactly one solution. 
  Input: numbers={8,2,7,11,5,1}, target=9 
  Output: index1=1, index2=6

题目大意

  给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。 
  要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引,且index1必须要小于index2。请注意一点,你返回的结果(包括index1和index2)都不是基于0开始的。你可以假设每一个输入肯定只有一个结果。

举例:

输入:数组={8,2,7,11,5,1}, 目标数= 9

输出:下标1=1,下标2=6

解题思路

  创建一个辅助类数组,对辅助类进行排序,使用两个指针,开始时分别指向数组的两端,看这两个下标对应的值是否等于目标值,如果等于就从辅助类中找出记录的下标,构造好返回结果,返回。如果大于就让右边的下标向左移,进入下一次匹配,如果小于就让左边的下标向右移动,进入下一次匹配,直到所有的数据都处理完

import java.util.Arrays;
import java.util.Random;public class Solution {/*** 辅助类*/private static class Node implements Comparable<Node> {int val; // 值int idx; // 值对应的数组下标public Node() {}public Node(int val, int idx) {this.val = val;this.idx = idx;}// 比较方法
        @Overridepublic int compareTo(Node o) {if (o == null) {return -1;}return this.val - o.val;}}/*** 001-Two Sum(求两个数的和) * * @param nums   输入数组* @param target 两个数相加的和* @return 两个数对应的下标*/public int[] twoSum(int[] nums, int target) {// 用于保存返回结果,返回-1表示没有找到满足条件的的时s。int[] result = {-1, -1};// 创建辅助数组Node[] tmp = new Node[nums.length];for (int i = 0; i < nums.length; i++) {tmp[i] = new Node(nums[i], i);}// 对辅助数组进行排序
        Arrays.sort(tmp);// 记录辅助数组中左边一个值的下标int lo = 0;// 记录辅助数组中右边一个值的下标int hi = nums.length - 1;// 从两边向中间靠陇进行求解while (lo < hi) {// 如果找到结果就设置返回结果,并且退出循环if (tmp[lo].val + tmp[hi].val == target) {result[0] = tmp[lo].idx + 1;result[1] = tmp[hi].idx + 1;if (tmp[lo].idx > tmp[hi].idx) {result[0] = tmp[hi].idx + 1;result[1] = tmp[lo].idx + 1;} else {result[0] = tmp[lo].idx + 1;result[1] = tmp[hi].idx + 1;}break;}// 如果大于目标值,右边的下标向左移动else if (tmp[lo].val + tmp[hi].val > target) {hi--;}// 如果小于目标值,左边的下标向右移动else {lo++;}}return result;}public static void main(String[] args) {int num = 100;
int [] arr = {7,2,3,4,5,1};int[] result=new Solution().twoSum(arr, 8);for (int i = 0; i < result.length; i++) { System.out.print(result[i]+",");}}
}//输出结果: 1,6,

修改原题:

给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。 
  要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引(找到任意一对即可),且找到的第一个数的大小和下标<=第二个数的大小下标。请注意一点,你返回的结果(包括index1和index2)都不是基于0开始的。

举例:

      输入: 数组={8,2,7,11,5,1}, 目标数= 9       

   输出:下标1=2,下标2=3 

代码如下(ps:只要修改原题代码中while循环条件的if判断语句就可以了)

import java.util.Arrays;
import java.util.Random;public class Solution2 {/*** 辅助类*/private static class Node implements Comparable<Node> {int val; // 值int idx; // 值对应的数组下标public Node() {}public Node(int val, int idx) {this.val = val;this.idx = idx;}// 比较方法
        @Overridepublic int compareTo(Node o) {if (o == null) {return -1;}return this.val - o.val;}}/*** 001-Two Sum(求两个数的和) * * @param nums   输入数组* @param target 两个数相加的和* @return 两个数对应的下标*/public int[] twoSum(int[] nums, int target) {// 用于保存返回结果int[] result = {-1, -1};// 创建辅助数组Node[] tmp = new Node[nums.length];for (int i = 0; i < nums.length; i++) {tmp[i] = new Node(nums[i], i);}// 对辅助数组进行排序
        Arrays.sort(tmp);// 记录辅助数组中左边一个值的下标int lo = 0;// 记录辅助数组中右边一个值的下标int hi = nums.length - 1;// 从两边向中间靠陇进行求解while (lo < hi) {// 如果找到结果就设置返回结果,并且退出循环            // 修改处:添加判断条件,必须满足第一个数值及对应下标都要小于第二个数值及对应下标。if (tmp[lo].val + tmp[hi].val == target && ((tmp[lo].val < tmp[hi].val&&tmp[lo].idx < tmp[hi].idx)||( (tmp[lo].val > tmp[hi].val&&tmp[lo].idx > tmp[hi].idx)))) {result[0] = tmp[lo].idx + 1;result[1] = tmp[hi].idx + 1;/*if (tmp[lo].idx > tmp[hi].idx) {result[0] = tmp[hi].idx + 1;result[1] = tmp[lo].idx + 1;} else {result[0] = tmp[lo].idx + 1;result[1] = tmp[hi].idx + 1;}*/break;}// 如果大于目标值,右边的下标向左移动else if (tmp[lo].val + tmp[hi].val > target) {hi--;}// 如果小于目标值,左边的下标向右移动else {lo++;}}return result;}public static void main(String[] args) {int num = 100;int [] arr = {7,2,3,4,5,1};;int[] result=new Solution2().twoSum(arr, 8);for (int i = 0; i < result.length; i++) { System.out.print(result[i]+",");}}
}
//输出:3,5,

转载于:https://www.cnblogs.com/iCodingLife/p/8278891.html

001LeetCode--TwoSum相关推荐

  1. leetCode:twoSum 两数之和 【JAVA实现】

    LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...

  2. leetcode - two-sum

    文章目录 Q A - 1 暴力破解 Q -2 查找表法 Q 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种 ...

  3. TwoSum,从O(n^2)到O(nlogn)再到O(n)

    TwoSum,两数之和 Given an array of integers, return indices of the two numbers such that they add up to a ...

  4. 《leetcode》two-sum

    题目描述 Given an array of integers, find two numbers such that they add up to a specific target number. ...

  5. Leetcode每日一题: 1.two-sum(两数之和)

    执行时间上仍有较大改进之处: 今天还get一个新的编译错误点: 编译错误 error: control may reach end of non-void function [-Werror,-Wre ...

  6. Leetcode 之 twoSum, ThreeSum, FourSum(K-Sum)问题

    在leetcode里有一类题目,可以统称为K Sum 问题,大意就是:给出一个数组,一个目标值,要求你找出这个数组中所有的组合,满足:这k个数的组合之和为target值. 举个栗子(four sum) ...

  7. 算法:两数之和(two-sum)。

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使用两遍. ...

  8. LeetCode简单题之两数之和

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

  9. Leetcode(18)-四数之和

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...

  10. 【Leetcode】 刷题之路1(python)

    leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...

最新文章

  1. mysql查询当前use的数据库
  2. setDrawingCacheEnabled(boolean flag)
  3. BZOJ2169 连边(动态规划)
  4. caffe 下测试 MNIST数据
  5. 使用IQueryable扩展方法实现复杂查询条件
  6. NET中解决KafKa多线程发送多主题的问题
  7. 查看进程占用的端口号,同时杀死此进程
  8. SUMO文档019:导入网络文件(上)——OpenStreetMap
  9. Linux移植笔记--arm64上的Linux系统移植
  10. 三菱驱动器参数表_三菱伺服驱动器参数都设置什么啊详细点谢谢
  11. 携程酒店数据爬取(新)
  12. 单片机 74HC595 实例
  13. Word插入Latex公式的几种方式(TeXsWord、EqualX、Aurora等工具)
  14. dex字符串解密_某Xposed微信群发工具dex解密分析
  15. 完美解决window10硬盘占用100%,很卡顿的现象(图文教程),亲测有效
  16. 在计算机中有什么作用,内存是什么在电脑中有什么作用
  17. Vmware Ubuntu实现文件拖拽
  18. 第三方登陆--接入谷歌和FaceBook
  19. linux mtr命令安装,如果mtr没在你的机子上安装
  20. 黑马JAVA P41 while循环

热门文章

  1. 从TIN获取任意坐标点高程(原创)
  2. 使用javadoc命令制作帮助文档(API)
  3. Yii 2.0 权威指南(3) 使用数据库
  4. [Java基础]StringUtils.join()方法与String.join()方法的使用
  5. Js中对URL进行转码与解码
  6. Servlet--ListenerFilter
  7. oracle创建java程序并执行
  8. 网页实现语音对讲_GB28181实现摄像头语音对讲 - web音频采集调用示例
  9. stm32采集脉冲信号_外部脉冲实现ADC采样的问题 STM32f103VE
  10. python海贼王logo_Python入门之生成海贼王云图