import java.util.Arrays;
/**
* Source : https://oj.leetcode.com/problems/two-sum-ii-input-array-is-sorted/
*
* Created by lverpeng on 2017/6/22.
*
* Given an array of integers that is already sorted in ascending order,
* 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
*
*/
public class TwoSum2 {
public static void main(String[] args) {
TwoSum2 twoSum2 = new TwoSum2();
int[] numbers = {15, 7, 2, 11};
twoSum2.quicksort(numbers, 0, 3);
System.out.println(Arrays.toString(numbers));
System.out.println(Arrays.toString(twoSum2.twoSum(numbers, 9)));
}
/**
* 相比于一,这个问题里面的输入数组是有序的,可以使用两个指针来分别指向数组的首尾,
* 根据当前指针指向的两个数的和与target的比较来决定那一个指针移动
* 时间复杂度:O(n),因为这里已经排好序了,如果还要排序的话,排序最佳时间复杂度是O(nlogn),quicksort
* 空间复杂度:O(1)
*
* @param numbers
* @param target
*/
public int[] twoSum (int[] numbers, int target) {
int[] result = new int[2];
int low = 0;
int high = numbers.length - 1;
while (low < high) {
if ((numbers[low] + numbers[high]) == target) {
result[0] = low + 1;
result[1] = high + 1;
break;
} else if ((numbers[low] + numbers[high]) > target) {
high--;
} else {
low++;
}
}
return result;
}
/**
* 快速排序
* 时间复杂度:平均O(nlogn),最坏O(n^2)
* 基本思路:
* 1. 取出一个基准,通常取最后一个元素
* 2. 定义首尾两个指针,根据基准将数组分成,左边是小于基准,右边大于基准
* 3. 递归的对左边和右边,执行步骤1、2
*
* @param nums
* @param start
* @param end
*/
public void quicksort (int[] nums, int start, int end) {
if (start >= end) {
return ;
}
int left = start;
int right = end;
int mid = nums[end];
while (left < right) {
while (nums[left] <= mid && left < right) {
left++;
}
while (nums[right] >= mid && left < right) {
right--;
}
swap(nums, left, right);
}
if (nums[left] >= mid) {
swap(nums, left, end);
} else {
left++;
}
quicksort(nums, start, left - 1);
quicksort(nums, left, end);
}
public void swap (int[] arr, int x, int y) {
int temp = arr[x];
arr[x] =arr[y];
arr[y] = temp;
}
}