leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
2017-06-05 02:02
716 查看
每天坚持刷leetcode----给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。
package leetcode.T001_TwoSum;
import java.util.Arrays;
/**
* @author 周志祥 E-mail: 1579655633@qq.com
* @date 创建时间:2017-4-30 上午1:01:33
* @version 1.0
* @parameter
* @since
* @return
*/
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;
}
@Override
public int compareTo(Node o) {
if (o == null) {
return -1;
}
return this.val - o.val;
}
}
/**
* <pre>
* 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={2, 7, 11, 15}, target=9
* Output: index1=1, index2=2
*
* 题目大意
* 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。
* 要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引,且index1必须要小于index2。
* 请注意一点,你返回的结果(包括index1和index2)都不是基于0开始的。你可以假设每一个输入肯定只有一个结果。
*
* 解题思路
* 创建一个辅助类数组,对辅助类进行排序,使用两个指针,开始时分别指向数组的两端,看这两个下标对应的值是否
* 等于目标值,如果等于就从辅助类中找出记录的下标,构造好返回结果,返回。如果大于就让右边的下标向左移,
* 进入下一次匹配,如果小于就让左边的下标向右移动,进入下一次匹配,直到所有的数据都处理完
* </pre>
*
* @param nums
* @param target
* @return
*/
public int[] twoSum(int[] nums, int target) {
int[] result = {0, 0};
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) {
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;
}
}
package leetcode.T001_TwoSum;
import java.util.Arrays;
/**
* @author 周志祥 E-mail: 1579655633@qq.com
* @date 创建时间:2017-4-30 上午1:01:33
* @version 1.0
* @parameter
* @since
* @return
*/
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;
}
@Override
public int compareTo(Node o) {
if (o == null) {
return -1;
}
return this.val - o.val;
}
}
/**
* <pre>
* 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={2, 7, 11, 15}, target=9
* Output: index1=1, index2=2
*
* 题目大意
* 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。
* 要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引,且index1必须要小于index2。
* 请注意一点,你返回的结果(包括index1和index2)都不是基于0开始的。你可以假设每一个输入肯定只有一个结果。
*
* 解题思路
* 创建一个辅助类数组,对辅助类进行排序,使用两个指针,开始时分别指向数组的两端,看这两个下标对应的值是否
* 等于目标值,如果等于就从辅助类中找出记录的下标,构造好返回结果,返回。如果大于就让右边的下标向左移,
* 进入下一次匹配,如果小于就让左边的下标向右移动,进入下一次匹配,直到所有的数据都处理完
* </pre>
*
* @param nums
* @param target
* @return
*/
public int[] twoSum(int[] nums, int target) {
int[] result = {0, 0};
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) {
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;
}
}
相关文章推荐
- 两数之和:给定一个整数数组,找出其中两个数相加等于目标值
- Java算法给定一个整数数组,找出其中两个数相加等于目标值
- Java算法给定一个整数数组,找出其中两个数相加等于目标值
- 给定一个整数数组,返回两个数字的索引,使它们相加得到一个特定目标值
- leetcode:java.T018_4Sum---给定一个整数数组,找出a + b + c + d = target的唯一解,不能有重复元素组
- JAVA函数实现任意给定一组数, 找出任意数相加等于某数或者在一个范围
- 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target(容易)
- 求解一个数组里等于给定整数和的两个数的O(n)时间复杂度算法
- 【Java】有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串的位置
- LeetCode试题之““给定一个正整数A,找到最小的正整数B,它的每一个数字的乘法等于A。””
- 计数排序——有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
- 面试题1: 给定一个数组, 里面是一些数字, 请只用一个for循环, 找出其中第二大的数字.
- 求解一个数组里等于给定整数和的两个数的O(n)时间复杂度算法
- 有一个整数数组(包括正数 负数 和0),给定一个M值,要求数组中的一个或多个值相加的和等于M,有多少种组合?
- 程序员面试题:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 从数组中找出一对元素,其和是一个给定的目标数字。假设数组中只存在一个符合要求的数值对,返回这些数值的下标
- 快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)