최대 하위 서열과 곱셈 최대 하위 그룹

1684 단어 동적 기획
제목 링크:
최대 하위 순서 및:https://leetcode-cn.com/problems/maximum-subarray/
승적 최대 하위 배열:https://leetcode-cn.com/problems/maximum-product-subarray/
문제 해결 방법:
동적 기획 문제는 세 가지 조건을 만족시켜야 한다. 첫째는 최우수자 구조이고, 둘째는 자 문제가 중첩되고, 셋째는 후효성이 없다.가장 어려운 것은 상태 이동 방정식을 찾는 것이다.
두 문제의 상태 이동 방정식의 관건은 i번째 요소로 끝나는 최대치를 이해하는 데 있다.
예를 들면 다음과 같습니다.
테스트 그룹은 [1,7,-3,4]
index=0 즉 원소1로 끝나는 하위 서열과 가장 큰 서열은 1이다(1로 끝나는 하위 서열이 하나밖에 없기 때문이다[1])
index=1 즉 원소7로 끝나는 서열과 가장 큰 서열은 얼마나 됩니까?원소 7로 끝나면 하위 서열은 반드시 7을 포함하고 최대값은 두 하위 서열에서 나올 수 있다
1. 그 앞의 원소와 연속하여 서열을 구성하려면 서열에는 반드시 그 앞의 원소인 1이 포함되고 index=i-1로 끝나는 가장 큰 원소는 우리가 구한 max[i-1]이기 때문에 max[i]=max[i-1]+nums[i];
2. 앞의 원소와 서열을 구성하지 않을 수도 있고 원소 자체가 서열이 되면 max[i]=nums[i];
따라서 max[i]=MAX(max[i-1]+nums[i],nums[i]);
 
class Solution {
    public int maxSubArray(int[] nums) {
        int ans = nums[0];
        int sum = 0;
        for(int num: nums) {
            sum = Math.max(sum+num, num);
            ans = Math.max(ans, sum);
        }
        return ans;
    }
}
class Solution {
    public int maxProduct(int[] nums) {
        int len = nums.length;
        if(len == 0){
            return 0;
        }
        int res = Integer.MIN_VALUE;
        int max_i = 1;
        int min_i = 1;
        for(int i = 0 ; i < len; i++){
            if(nums[i] < 0){
                int temp = max_i;
                max_i = min_i;
                min_i = temp;
            }
            max_i = Math.max(max_i*nums[i], nums[i]);
            min_i = Math.min(min_i*nums[i], nums[i]);
            res = Math.max(max_i, res);
        }
        return res;
    }
}

 

좋은 웹페이지 즐겨찾기