开发人员必须掌握的高频算法题之数组(1)

1.搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
考点:二分法查找

 public int binarySearch(int[] numbers, int target) {
        int start = 0;
        int end = numbers.length - 1;

        while (end >= start) {
            int mid = (start + end) / 2;
            if (target > numbers[mid]) {
                start = mid + 1;
            } else if (target < numbers[mid]) {
                end = mid - 1;
            } else {
                return mid;
            }
        }
        return end + 1;
    }

2.移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并「原地」修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
考点:双指针

 public int[] removingElements(int[] numbers, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < numbers.length; fastIndex++) {
            if (numbers[fastIndex] != val) {
                numbers[slowIndex] = numbers[fastIndex];
                slowIndex++;
            }
        }
        return numbers;
    }

3.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
考点:滑动窗口

public int smallestArray(int[] numbers, int target) {
       int i = 0;
       int sum = 0;
       int result = Integer.MAX_VALUE;
       int subLength;

       for (int j = 0; j < numbers.length; j++) {
            sum += numbers[j];
            while (sum>target){
                subLength = j - i + 1;
                result = Math.min(subLength,result);
                sum -= numbers[i++];
            }
       }
       return result == Integer.MAX_VALUE ? 0 : result;
   }

4.螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[ [ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ] ]
考点:还原能力

  public int[][] generateMatrix(int n) {
        int[][] arr = new int[n][n];
        int c = 1, j = 0;
        while (c <= n * n) {

            for (int i = j; i < n - j; i++)
                arr[j][i] = c++;
            for (int i = j + 1; i < n - j; i++)
                arr[i][n - j - 1] = c++;
            for (int i = n - j - 2; i >= j; i--)
                arr[n - j - 1][i] = c++;
            for (int i = n -j - 2; i > j; i--)
                arr[i][j] = c++;

            j++;
        }
        return arr;
    }

下集预告:程序员必须掌握的高频算法题之链表(2)

你可能感兴趣的:(开发人员必须掌握的高频算法题之数组(1))