diff --git a/.gitignore b/.gitignore
index 86defc3c..eb72862a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
*.iml
.idea
out
+target
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 00000000..5e02b9f3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,83 @@
+
+
+ * HashSet + 双指针 问题
+ */
+public class HashSetSolution {
+ public int lengthOfLongestSubstring(String s) {
+ int len = s.length();
+ Set> threeSum(int[] nums) {
List
> list = new ArrayList<>();
int len = nums.length;
if (len < 3) return list;
+ // 先排序
Arrays.sort(nums);
int max = nums[len - 1];
+ // 最大值小于0, 那么不存在sum == 0 的解
if (max < 0) return list;
for (int i = 0; i < len - 2; ) {
+ // 最小值小于0, 那么不存在sum == 0 的解
if (nums[i] > 0) break;
if (nums[i] + 2 * max < 0) {
while (nums[i] == nums[++i] && i < len - 2) ;
continue;
}
+ // 对于任意一个nums[i],在数组中的其他数中解2sum问题,目标为target-sums[i]
int left = i + 1, right = len - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
list.add(Arrays.asList(nums[i], nums[left], nums[right]));
+ // 去重
while (nums[left] == nums[++left] && left < right) ;
while (nums[right] == nums[--right] && left < right) ;
} else if (sum < 0) ++left;
diff --git a/src/com/blankj/medium/_033/Solution2.java b/src/com/blankj/medium/_033/Solution2.java
new file mode 100644
index 00000000..ee0d472e
--- /dev/null
+++ b/src/com/blankj/medium/_033/Solution2.java
@@ -0,0 +1,65 @@
+package com.blankj.medium._033;
+
+/**
+ * Created by dash wang on 2/11/18.
+ */
+public class Solution2 {
+
+ private int findDivisionIndex(int[] nums, int len) {
+ int left = 0, right = 1;
+ while (right < len && nums[left] < nums[right]) {
+ left++;
+ right++;
+ }
+ return left;
+ }
+
+ private int binarySearchRecursive(int[] nums, int low, int high, int target) {
+ int foundIndex = -1;
+ while (low < high) {
+ int mid = (low + high) / 2;
+ if (nums[mid] == target) {
+ return mid;
+ } else if (nums[mid] > target) {
+ return binarySearchRecursive(nums, low, mid - 1, target);
+ } else {
+ return binarySearchRecursive(nums, mid + 1, high, target);
+ }
+ }
+ return foundIndex;
+ }
+
+ private int binarySearchIteration(int[] nums, int low, int high, int target) {
+ int foundIndex = -1;
+ while(low < high) {
+ int mid = (low + high) / 2;
+ if(nums[mid] == target) {
+ return mid;
+ } else if(nums[mid] > target) {
+ high = mid - 1;
+ } else {
+ low = mid + 1;
+ }
+ }
+ return foundIndex;
+ }
+
+ public int search(int[] nums, int target) {
+ int index = -1;
+ int len = nums.length;
+ // Find division index
+ int divisionIndex = findDivisionIndex(nums, len);
+ // Decide which side to search
+ if (nums[0] <= target && nums[divisionIndex] >= target) {
+ index = binarySearchIteration(nums, 0, divisionIndex, target);
+ } else if (nums[divisionIndex + 1] <= target && nums[len - 1] >= target) {
+ index = binarySearchIteration(nums, divisionIndex + 1, len, target);
+ }
+ return index;
+ }
+
+ public static void main(String[] args) {
+ Solution2 solution2 = new Solution2();
+ System.out.println(solution2.search(new int[]{2, 1}, 1));
+ }
+}