结合了简单交换排序的 Two Sum。。。 leetcode上超出时间限制
也是,本来就是想减少暴力解决中的循环,排序和排除比target大的部分又用了一个for两层嵌套循环和while循环(我到底图个什么)
下面仅是简单交换排序(新的Two Sum提交就留在leetcode让我羞愧吧)
import java.util.Arrays;
/**
* @Author:lixici
* @Date:2020/08/26 22:41
*/
public class SwapSort {
// 升序 or 降序(默认升序)
SortType sortType;
SwapSort(){
this.sortType = SortType.ASC;
}
SwapSort(SortType sortType){
this.sortType = sortType;
}
/**
* 简单交换排序(升序)
* 思路:
* 从第一个位置开始,
* 对于每一个位置,与后面的位置逐个比较,当前位置大于后面某位置,则与之交换数值
* 这样经过第一次循环,最小的数值被交换到了第一个位置
*/
/*返回第i个位置放置好最终数值的数组*/
void compareAndSwap(int i, int[] arr){
int first = arr[i];
for(int p = i + 1, length = arr.length; p < length; p++){
int after = arr[p];
int swapCondition = 0;
if(sortType.equals(SortType.DESC)){
swapCondition = after - first;
}else{
swapCondition = first - after;
}
if(swapCondition > 0){
arr[i] = after;
arr[p] = first;
first = after;// 测试后添加
// 目的是找到i位置该放置的值,first代表该值
// 不断用arr的第i个位置的数值,和后面的值比较
// 当发生交换时,arr[i]更新(也就是first更新)
// 这里写成 fitst = arr[i]; 更好理解
}
}
}
/*对整个数组排序*/
public void sortArray(int[] arr){
for(int i = 0,length = arr.length; i < length; i++){
compareAndSwap(i,arr);
// System.out.println("第"+(i+1)+"次" + Arrays.toString(arr));
}
}
enum SortType{
ASC,DESC;
}
public static void main(String[] args) {
int[] arr = {9,8,55,6,34,11,-12,22,99,33,44,55,9,102};
SwapSort asc = new SwapSort();
asc.sortArray(arr);
System.out.println("asc==>" + Arrays.toString(arr));
SwapSort desc = new SwapSort(SortType.DESC);
desc.sortArray(arr);
System.out.println("desc==>" + Arrays.toString(arr));
}
}