Ежедневный вопрос: максимальная сумма подмассива Leetcode53

Каталог статей

Серия: Обучение жадному алгоритму
Язык: Java
Источник темы: Leetcode53 Максимальная сумма подмассива
Сложность: Средняя
Контрольная точка: Идеи и понимание жадного алгоритма && Насильственные алгоритмы


описание темы

Учитывая целочисленный массив nums, найдите непрерывный подмассив с наибольшей суммой (подмассив содержит хотя бы один элемент) и верните его наибольшую сумму. Подмассив — это непрерывная часть массива.

Пример 1: > Ввод: nums = [-2,1,-3,4,-1,2,1,-5,4] Вывод: 6 Объяснение: Последовательные подмассивы [4,-1,2,1] и максимум 6.

Пример 2: > Ввод: nums = [1] Вывод: 1**** Подсказка: > 1 <= nums.length <= 10 5-10 4 <= nums[i] <= 10^4

1. Два способа мышления:

Насильственный метод и жадный алгоритм (друзья, которые могут использовать dp, могут попробовать использовать dp для его решения, здесь только две идеи) Насильственный метод : когда мы получаем этот вопрос, мы можем использовать насилие, когда видим его. Этот вопрос может использовать два слоя Цикл for решает ее отлично, но по лимиту вопроса временная сложность не удовлетворяет условиям, и он точно выйдет по таймауту, анализ такой: лимитная длина в вопросе: 1 <= nums. length <= 10 5, два уровня данных цикла for получаются равными 10 8. Двухуровневый цикл for может обрабатывать только около 5000 данных, поэтому он должен истечь по тайм-ауту, но мы можем применить наше мышление с насилием. следует; Жадный алгоритм: у жадного алгоритма нет шаблона, и основным тестом являются наши идеи решения проблем; в этом вопросе, как достичь локального оптимума, используйте слой цикла for для прохождения, то есть непрерывная сумма больше 0, тогда, когда непрерывная сумма меньше 0, мы должны записать сумму интервала до 0, а затем в i+1 снова начать вычислять интервал и, наконец, сравнить размер нескольких интервалов, чтобы найти наибольший интервальная сумма, например: 3 -5 3 1 -3 -1 Когда i=0, число =3, когда i=1, число =-2 , В это время непрерывная сумма меньше 0, тогда мы используем результат для запишите сумму интервала до того, как непрерывная сумма будет равна 0, в это время будет 3; в это время головка начинается с i = 0,3, заканчивайте этот интервал и перемещайте головку из -5 Начинайте со следующего i = 2, пересчитывайте num, а затем сравните цену с результатом.

2. Справочный кодекс закона о насилии:

class Solution {
    
     
暴力法:  
  public int maxSubArray(int[] nums) {
    
        
      int num =Integer.MIN_VALUE;     
         for(int i =0;i<nums.length;i++){
    
                
         int result =0;         
            int j =i;            
            while(j<nums.length){
    
               
                 result += nums[j];          
                       num=result>num?result:num;                j++;                }        }       
                        return num;    }}```
贪心算法
```java
class Solution {
    
    
//         贪心算法
//  如果连续和为负数了 那么记下此时的为0前的值 从下一个开始从新计数,通过比较下一个区间的和,然后判断    public int maxSubArray(int[] nums) {     
   int result = Integer.MIN_VALUE;     
      int num = 0;      
        for(int i =0;i<nums.length;i++){
    
              
          num += nums[i];         
             if(num>result){
    
                
                 result = num;            }         
                    if(num<0){
    
                    num =0;            }        }        return result;    }}```
以上分析,希望对您有所帮助,您的支持是我最大的动力,感谢一键三连!!

Supongo que te gusta

Origin blog.csdn.net/weixin_54174102/article/details/130049616
Recomendado
Clasificación