기사 디렉토리
시리즈: Greedy Algorithm 교육
언어: Java
주제 출처: Leetcode53 최대 하위 배열 합계
난이도: 중간
테스트 포인트: Greedy Algorithm Ideas and Understanding && Violent Algorithms
주제 설명
정수 배열 숫자가 주어지면 합계가 가장 큰 연속 하위 배열(하위 배열에는 하나 이상의 요소가 포함됨)을 찾고 가장 큰 합계를 반환하십시오. 하위 배열은 배열의 연속 부분입니다.
예 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이 됩니다 . 그리디 알고리즘: 그리디 알고리즘에는 템플릿이 없으며 주요 테스트는 우리의 문제 해결 아이디어입니다 . 0보다 크면 연속 합계가 0보다 작을 때 간격 합계를 0보다 먼저 기록하고 i+1에서 다시 시작하여 간격 계산을 시작하고 마지막으로 여러 간격의 크기를 비교하여 가장 큰 값을 찾습니다. 간격 합, 예: 3 -5 3 1 -3 -1 i=0일 때 num =3, i=1일 때 num =-2 ; 이때 연속 합계가 0보다 작으면 결과를 사용하여 연속 합이 0이 되기 전의 구간합을 기록하고 이때는 3, 이때 헤드는 i=0,3에서 시작하여 이 구간을 종료하고 -5에서 헤드를 이동 다음 i=2에서 시작하여 재계산 숫자를 입력한 다음 가격을 결과와 비교합니다.
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; }}```
以上分析,希望对您有所帮助,您的支持是我最大的动力,感谢一键三连!!