6090. 极大极小游戏

image.png
image.png
实现思路比较简单,递归

  1. class Solution {
  2. public int minMaxGame(int[] nums) {
  3. int n = nums.length;
  4. if (n == 0) return 0;//只有一个数字
  5. if (n == 1) return nums[0];//两个数字只比较一次
  6. int[] newNum = new int[n / 2];
  7. for (int i = 0; i < n / 2; i++) {
  8. newNum[i] = (i % 2 == 0) ? Math.min(nums[2 * i], nums[2 * i + 1]) : Math.max(nums[2 * i], nums[2 * i + 1]);
  9. }
  10. return minMaxGame(newNum);//再返回方法
  11. }
  12. }

6091. 划分数组使最大差为 K

image.png
image.png
该数组里的最大值减去最小值小于等于K即为一个子序列,如果与任意数相减都大于K,子序列只有其本身。

  1. class Solution {
  2. public int partitionArray(int[] nums, int k) {
  3. Arrays.sort(nums);
  4. int num=0;
  5. for(int i=0;i<nums.length-1){
  6. for(int j=1;j<nums.length;j++){
  7. if((nums[j]-nums[i])<=k){
  8. i++;
  9. }else{
  10. num++;
  11. }
  12. i++;
  13. }
  14. }
  15. return num;
  16. }
  17. }

思路是将要通过两层for循环来遍历,即比较后边的数字比前边的数字是否大于2,大于2就统计一个子序列,但是一直没能使用for循环赋值的思想。可以将排序后的最小值赋给min,如果统计完一个子序列就把子序列的下一个数赋值给min,并统计,因为num始终是大于1的。

  1. class Solution {
  2. public int partitionArray(int[] nums, int k) {
  3. Arrays.sort(nums);
  4. int n = nums.length;
  5. if (n == 0) return 1;
  6. if (n == 1) return 1;
  7. int num=1;
  8. int min=nums[0];
  9. for(int i=0;i<n;i++){
  10. if(nums[i]-min>k){
  11. num++;
  12. min =nums[i];
  13. }
  14. }
  15. return num;
  16. }