算法题小点

找到数组中的两个数,和是target

先排序,然后利用双指针

public int[] twoSum(int[] nums, int target) {
    Arrays.sort(nums);
    int left = 0, right = nums.length - 1;
    while (left < right) {
        int sum = nums[left] + nums[right];
        if (sum < target) {
            left++;
        } else if (sum > target) {
            right--;
        } else {
            return new int[]{nums[left], nums[right]};
        }
    }
    return new int[]{};
}

比较两个数组大小

/**
 * 比较两个数组大小
 * @param arr1 数组1
 * @param arr2 数组2
 * @param p1 数组1的起始位置
 * @param p2 数组2的起始位置
 */
public int compareList(List<Integer> arr1, List<Integer> arr2, int p1, int p2) {
    int len1 = arr1.size(), len2 = arr2.size();
    while (p1 < len1 && p2 < len2) {
        if (!arr1.get(p1).equals(arr2.get(p2))) {
            return arr1.get(p1) - arr2.get(p2);
        }
        p1++;
        p2++;
    }
    return len1 - len2;
}

合并两个数组,形成一个最大或最小数组

/**
 * 合并两个数组,形成一个最大或最小数组
 */
public List<Integer> merge(List<Integer> arr1, List<Integer> arr2) {
    List<Integer> res = new ArrayList<>();
    int len1 = arr1.size();
    int len2 = arr2.size();
    int p1 = 0, p2 = 0;
    while (p1 < len1 && p2 < len2) {
        //这里不能单纯地判断一个值的大小,应当判断整个数组的大小
        if (compareList(arr1, arr2, p1, p2) > 0) { 
            res.add(arr1.get(p1++));
        } else {
            res.add(arr2.get(p2++));
        }
    }
    while (p1 < len1) res.add(arr1.get(p1++));
    while (p2 < len2) res.add(arr2.get(p2++));
    return res;
}

hhhhh