Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7279a82

Browse files
author
王俊超
committed
commit
1 parent d83949a commit 7279a82

File tree

6 files changed

+110
-40
lines changed

6 files changed

+110
-40
lines changed

.idea/modules.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

【001】【TwoSum】/src/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Author: Íõ¿¡³¬
2+
* Author: 王俊超
33
* Date: 2015-06-18
44
* Time: 09:17
55
* Declaration: All Rights Reserved !!!

【001】【TwoSum】/src/Solution.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import java.util.Arrays;
22

33
/**
4-
* Author: 王俊超
4+
* Author: 王俊超
55
* Date: 2015-06-17
66
* Time: 20:27
77
* Declaration: All Rights Reserved !!!
@@ -40,15 +40,15 @@ public int compareTo(Node o) {
4040
* Input: numbers={2, 7, 11, 15}, target=9
4141
* Output: index1=1, index2=2
4242
*
43-
* 题目大意
44-
* 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。
45-
* 要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引,且index1必须要小于index2。
46-
* 请注意一点,你返回的结果(包括index1和index2)都不是基于0开始的。你可以假设每一个输入肯定只有一个结果。
43+
* 题目大意
44+
* 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。
45+
* 要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引,且index1必须要小于index2。
46+
* 请注意一点,你返回的结果(包括index1和index2)都不是基于0开始的。你可以假设每一个输入肯定只有一个结果。
4747
*
48-
* 解题思路
49-
* 创建一个辅助类数组,对辅助类进行排序,使用两个指针,开始时分别指向数组的两端,看这两个下标对应的值是否
50-
* 等于目标值,如果等于就从辅助类中找出记录的下标,构造好返回结果,返回。如果大于就让右边的下标向左移,
51-
* 进入下一次匹配,如果小于就让左边的下标向右移动,进入下一次匹配,直到所有的数据都处理完
48+
* 解题思路
49+
* 创建一个辅助类数组,对辅助类进行排序,使用两个指针,开始时分别指向数组的两端,看这两个下标对应的值是否
50+
* 等于目标值,如果等于就从辅助类中找出记录的下标,构造好返回结果,返回。如果大于就让右边的下标向左移,
51+
* 进入下一次匹配,如果小于就让左边的下标向右移动,进入下一次匹配,直到所有的数据都处理完
5252
* </pre>
5353
*
5454
* @param nums
Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Author: 王俊超
2+
* Author: 王俊超
33
* Date: 2015-06-21
44
* Time: 14:48
55
* Declaration: All Rights Reserved !!!
@@ -14,15 +14,15 @@ public class Solution {
1414
*
1515
* You may assume no duplicate exists in the array.
1616
*
17-
* 题目大意:
18-
* 假设一个排序的数组以一个未知的的枢轴旋转。(即,0 1 2 4 5 6 7可能成为4 5 6 7 0 1 2)。
19-
* 给定一个目标值,在数组中搜寻。如果存在就返回其对应的下标,否则返回-1。
20-
* 假设数组中不存在重复值。
17+
* 题目大意:
18+
* 假设一个排序的数组以一个未知的的枢轴旋转。(即,0 1 2 4 5 6 7可能成为4 5 6 7 0 1 2)。
19+
* 给定一个目标值,在数组中搜寻。如果存在就返回其对应的下标,否则返回-1。
20+
* 假设数组中不存在重复值。
2121
*
22-
* 解题思路:
23-
* 找旋转数组最小值的位置minIndex(见LeetCode第153题 ),如果minIndex不为,说明其在分隔成
24-
* 两个有序数组,并且前一个中的第一个元素都大于后一个数组的每一个元素,判断target中哪一个数组区
25-
* 间中使用二叉搜索算法查找,如果minIndex=0,说明全局有序,对整个数组进行二叉查找,返回查找结果
22+
* 解题思路:
23+
* 找旋转数组最小值的位置minIndex(见LeetCode第153题 ),如果minIndex不为,说明其在分隔成
24+
* 两个有序数组,并且前一个中的第一个元素都大于后一个数组的每一个元素,判断target中哪一个数组区
25+
* 间中使用二叉搜索算法查找,如果minIndex=0,说明全局有序,对整个数组进行二叉查找,返回查找结果
2626
* </pre>
2727
*
2828
* @param nums
@@ -33,24 +33,24 @@ public int search(int[] nums, int target) {
3333

3434
if (nums != null && nums.length > 0) {
3535

36-
// 找最小元素对应的下标
36+
// 找最小元素对应的下标
3737
int minIndex = searchMinIndex(nums, 0, nums.length - 1);
3838

39-
// 整个数组全局有序
39+
// 整个数组全局有序
4040
if (minIndex == 0) {
4141
return binarySearch(nums, 0, nums.length - 1, target);
4242
}
43-
// 有两个局部有序区间, 如 4 5 6 7 8 9 0 1 2 3
43+
// 有两个局部有序区间, 如 4 5 6 7 8 9 0 1 2 3
4444
else {
45-
// 恬好和后一个有序区间的最后一个元素相等,返回对应的下标
45+
// 恬好和后一个有序区间的最后一个元素相等,返回对应的下标
4646
if (nums[nums.length - 1] == target) {
4747
return nums.length - 1;
4848
}
49-
// target可能在后一个有序区间中
49+
// target可能在后一个有序区间中
5050
else if (nums[nums.length - 1] > target) {
5151
return binarySearch(nums, minIndex, nums.length - 1, target);
5252
}
53-
// target可能是前一个有序区间中
53+
// target可能是前一个有序区间中
5454
else {
5555
return binarySearch(nums, 0, minIndex - 1, target);
5656
}
@@ -61,13 +61,13 @@ else if (nums[nums.length - 1] > target) {
6161
}
6262

6363
/**
64-
* 二分搜索
64+
* 二分搜索
6565
*
66-
* @param nums 数组
67-
* @param start 起始位置
68-
* @param end 结束位置
69-
* @param target 搜索目标
70-
* @return 匹配元素的下标
66+
* @param nums 数组
67+
* @param start 起始位置
68+
* @param end 结束位置
69+
* @param target 搜索目标
70+
* @return 匹配元素的下标
7171
*/
7272
public int binarySearch(int[] nums, int start, int end, int target) {
7373

@@ -88,33 +88,33 @@ public int binarySearch(int[] nums, int start, int end, int target) {
8888
}
8989

9090
/**
91-
* 找最小元素的下标
91+
* 找最小元素的下标
9292
*
93-
* @param nums 数组
94-
* @param start 起始位置
95-
* @param end 结束位置
96-
* @return 最小元素的下标
93+
* @param nums 数组
94+
* @param start 起始位置
95+
* @param end 结束位置
96+
* @return 最小元素的下标
9797
*/
9898
public int searchMinIndex(int[] nums, int start, int end) {
9999

100100
int mid;
101101
while (start < end) {
102102
mid = start + ((end - start) >> 1);
103-
// 后一个数比前个数小就找到了
103+
// 后一个数比前个数小就找到了
104104
if (nums[mid] > nums[mid + 1]) {
105105
return mid + 1;
106106
}
107-
// 说明中间值在第一个有序的数组中
107+
// 说明中间值在第一个有序的数组中
108108
else if (nums[mid] > nums[start]) {
109109
start = mid;
110110
}
111-
// 说明中间值在第二个有序的数组中
111+
// 说明中间值在第二个有序的数组中
112112
else {
113113
end = mid;
114114
}
115115
}
116116

117-
// 说明整个数组是有序的
117+
// 说明整个数组是有序的
118118
return 0;
119119
}
120120
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/**
2+
* @author: wangjunchao(王俊超)
3+
* @time: 2018-09-28 16:17
4+
**/
5+
public class Solution {
6+
/**
7+
* 如果数组很大,target很小,可以考虑先用二分查找法找到不大于target元素的下标,再作处理
8+
* @param numbers
9+
* @param target
10+
* @return
11+
*/
12+
public int[] twoSum(int[] numbers, int target) {
13+
// int idx = search(numbers, target);
14+
int idx = numbers.length - 1;
15+
return twoSum(numbers, target, idx);
16+
}
17+
18+
public int[] twoSum(int[] numbers, int target, int end) {
19+
int[] result = {0, 0};
20+
21+
int lo = 0;
22+
int hi = end;
23+
24+
while (lo < hi) {
25+
if (numbers[lo] + numbers[hi] == target) {
26+
result[0] = lo;
27+
result[1] = hi;
28+
break;
29+
} else if (numbers[lo] + numbers[hi] > target) {
30+
hi--;
31+
} else {
32+
lo++;
33+
}
34+
}
35+
36+
return result;
37+
}
38+
39+
public int search(int[] numbers, int target) {
40+
41+
int lo = 0;
42+
int hi = numbers.length - 1;
43+
int mid;
44+
45+
while (lo <= hi) {
46+
mid = lo + (hi - lo) / 2;
47+
if (numbers[mid] == target) {
48+
return mid;
49+
} else if (numbers[mid] > target) {
50+
hi = mid - 1;
51+
} else {
52+
lo = mid + 1;
53+
}
54+
55+
}
56+
return hi;
57+
}
58+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
</component>
11+
</module>

0 commit comments

Comments
 (0)