매일 한 문제 - 검지 Offer 42.연속 서브그룹의 최대 및
제목 정보
예:
: nums = [-2,1,-3,4,-1,2,1,-5,4]
: 6
: [4,-1,2,1] , 6。
프롬프트
1. 1 <= arr.length <= 10^5
2. -100 <= arr[i] <= 100
문제풀이의 방향
난점
흔히 볼 수 있는 해법
시간 복잡도
공간 복잡도
폭력 수색
O(N^2)
O(1)
분치사상
O(NlogN)
O(logN)
동적 기획
O(N)
O(1)
구체적 사고방식
동적 기획
코드
class Solution {
public int maxSubArray(int[] nums) {
if(nums == null || nums.length == 0){
return 0;
}
int sum = nums[0];
int former = 0;// dp[i-1] , dp[0] , dp[-1]=0
int cur= nums[0];// dp[i]
for(int num: nums){
if(former <= 0){
cur = num;
}
if(former > 0){
cur = former + num;
}// cur = Math.max(former,0) + num;
former = cur;
sum = Math.max(sum,cur);
}
return sum;
}
}
복잡성 분석:
기타 우수한 해답
문제풀이의 방향
분리법, 우리는 수조nums를 중간 위치 (mid) 로 왼쪽 (left) 오른쪽 (right) 두 부분으로 나눈다.그럼 레프트=nums[0]...nums[m - 1]와 right = nums[m + 1]...nums[n-1]
최대 하위 시퀀스 및 위치는 다음 세 가지입니다.
nums[m]
를 고려하여 좌우 두 부분을 뛰어넘는다. 여기서 중간원소부터 왼쪽으로 접두사를 구하면 가장 크고 오른쪽으로 접두사를 구하면 가장 크며 연속성을 유지한다.class MaximumSubarrayDivideConquer {
public int maxSubArrayDividConquer(int[] nums) {
if (nums == null || nums.length == 0) return 0;
return helper(nums, 0, nums.length - 1);
}
private int helper(int[] nums, int l, int r) {
if (l > r) return Integer.MIN_VALUE;
int mid = (l + r) >>> 1;
int left = helper(nums, l, mid - 1);
int right = helper(nums, mid + 1, r);
int leftMaxSum = 0;
int sum = 0;
// left surfix maxSum start from index mid - 1 to l
for (int i = mid - 1; i >= l; i--) {
sum += nums[i];
leftMaxSum = Math.max(leftMaxSum, sum);
}
int rightMaxSum = 0;
sum = 0;
// right prefix maxSum start from index mid + 1 to r
for (int i = mid + 1; i <= r; i++) {
sum += nums[i];
rightMaxSum = Math.max(sum, rightMaxSum);
}
// max(left, right, crossSum)
return Math.max(leftMaxSum + rightMaxSum + nums[mid], Math.max(left, right));
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.