20200612:力扣192周周赛上

力扣192周周赛上

  • 题目
  • 思路与算法
  • 代码实现
  • 复杂度分析

题目

1. 重新排列数组
20200612:力扣192周周赛上_第1张图片
2. 数组中的k个最强值
20200612:力扣192周周赛上_第2张图片

思路与算法

  1. 第一题不需要太多思路,最简单的就是list,list将要求的顺序的数依次收入,再将其按照顺序重新放回nums。或者,直接用顺序上的规律来写即可。
  2. 第二题的话,也没思路问题,排序,获取中位数,然后进行判断即可,注意只要前k个符合要求的数,其他的注意写的时候的一些细节即可。

代码实现

1. 重新排列数组

class Solution {
    public int[] shuffle(int[] nums, int n) {
        int[] res = new int[2*n];
        for (int i = 0; i < n; i++) {
            res[2*i] = nums[i];
        }
        for (int j = 0; j < n; j++) {
            res[2*j+1] = nums[j+n];
        }
        return res;
    }
}
class Solution {
    public int[] shuffle(int[] nums, int n) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            list.add(nums[i]);
            list.add(nums[i+n]);
        }
        for (int j = 0; j < 2*n; j++) {
            nums[j] = list.get(j);
        }
        return nums;
    }
}

2. 数组中的k个最强值

class Solution {
    public int[] getStrongest(int[] arr, int k) {
        Arrays.sort(arr);
        
        int len = arr.length;
        int left = 0;
        int right = len - 1;
        int mid = arr[(len-1)/2];
        int[] res = new int[k];
        int count = 0;
        while (count < k) {
            if (Math.abs(arr[right] - mid) >= Math.abs(arr[left] - mid)) {
                res[count++] = arr[right];
                right--;
            } else {
                res[count++] = arr[left];
                left++;
            }
        }
        return res;
    }
}

复杂度分析

  1. 第一题时间复杂度为O(N)
  2. 第二题时间复杂度为O(N)+O(NlogN) = O(NlogN)

你可能感兴趣的:(leetcode学习记录篇)