maxSlidingWindow-la valeur maximale de la fenêtre coulissante

Exigences du sujet

Étant donné un tableau d'entiers nums, il existe une fenêtre glissante de taille k qui se déplace du côté le plus à gauche du tableau vers le côté le plus à droite du tableau. Vous ne pouvez voir les nombres k que dans la fenêtre coulissante. La fenêtre coulissante ne se déplace que d'une position vers la droite à la fois.

Renvoie la valeur maximale dans la fenêtre glissante.

Exemple 1:

Entrée: nums = [1,3, -1, -3,5,3,6,7], k = 3
Sortie: [3,3,5,5,6,7]
Explication:
La position maximale du glissement la fenêtre


[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

Exemple 2:

Entrée: nums = [1], k = 1
Sortie: [1]

Exemple 3:

Entrée: nums = [1, -1], k = 1
Sortie: [1, -1]

Exemple 4:

Entrée: nums = [9,11], k = 2
Sortie: [11]

Exemple 5:

Entrée: nums = [4, -2], k = 2
Sortie: [4]

rapide:

1 <= nums.length <= 105-104 <=
nums [i] <= 104
1 <= k <= nums.length

Idées de résolution de problèmes

1. Déterminez d'abord le nombre de valeurs de retour
2. Trouvez la
valeur maximale des k premiers nombres 3.1 Si la valeur maximale est le premier nombre, poussez la fenêtre sur le nombre suivant et trouvez à nouveau la valeur maximale
3.2 Si la valeur maximale n'est pas le premier Si vous poussez la fenêtre vers le nombre suivant, il vous suffit de juger lequel est supérieur au plus grand nombre et au nombre suivant.
4Retournez le résultat
ps (recherche de valeur maximale s'il y a plusieurs valeurs maximales pour k nombres, la dernière position est la valeur maximale, réduisez ensuite la quantité de calcul)

Code de résolution de problèmes

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int[] res=new int[nums.length-(k-1)];//用来存放结果
        int[] max1 = findMax(nums, 0, k);//找出最大值,和最大值的位置
        int max= max1[0];//最大值存入max变量中
        res[0]=max;//结果数组第一个值确定下来
         int flag =k;
         while (flag <nums.length)循环之后变量,找出每一回推的最大值
         {
             if(max1[1]==flag-k)//如果最大值是第一个值,则重新找最大值
             {
                 max1=findMax(nums,flag-k+1,k);
                 max=max1[0];
                 res[flag -k+1]=max;
             }
            else if(nums[flag]>=max)
            {
                res[flag -k+1]=nums[flag];
                max=nums[flag];
            }
            else
             {
                 res[flag -k+1]=max;
             }

             flag++;
         }
         return  res;
    }
    public int[] findMax(int[] nums,int s,int k)
    {
        int r =-1;//用来判断是否是第一个数
        int maxElem=Integer.MIN_VALUE;//找出最大值
        for (int i = s; i < s+ k; i++) {
            if(maxElem<=nums[i])
            {
                maxElem=nums[i];
                r =i;
            }

        }
        return new int[]{maxElem, r};
    }
}

effet

La
réponse info a réussi:
temps d'exécution: 773 ms, battant 5,06% des utilisateurs Java
Consommation de mémoire: 59,3 Mo, battant 8,71% des utilisateurs Java

Je suppose que tu aimes

Origine blog.csdn.net/tangshuai96/article/details/112104706
conseillé
Classement