leetcode 의 연속 하위 배열 의 최대 곱 하기

제목: 정수 배열 nums 를 드 리 겠 습 니 다. 배열 에서 곱 하기 가 가장 큰 연속 서브 배열 (이 서브 배열 에 최소한 하나의 숫자 가 포함 되 어 있 음) 을 찾 아 이 서브 배열 에 대응 하 는 곱 하기 를 되 돌려 주 십시오.예제 1: 입력: [2, 3, - 2, 4] 출력: 6 해석: 서브 배열 [2, 3] 은 최대 곱 하기 6 이 있다.
예시 2: 입력: [- 2, 0, - 1] 출력: 0 해석: 결 과 는 2 가 될 수 없습니다. [- 2, - 1] 은 하위 그룹 이 아니 기 때 문 입 니 다.사고방식: 곱셈 의 최대 치 를 구하 라. 예 를 들 어 음수 가 나타 나 기 때문에 하나의 양수 곱 하기 음 수 는 음수 가 된다. 즉, 최대 치 곱 하기 음 수 는 최소 치가 된다.마찬가지 로 최소 치 에 음 수 를 곱 하면 최대 치가 될 수도 있다.최대 치 나 최소 치 곱 하기 0 도 모두 0 이 되 었 다.따라서 우 리 는 두 개의 동적 계획 배열, f [i] 로 i 까지 연속 서브 배열 의 최대 곱 하기 를 저장 합 니 다.g [i] j 까지 저장 하고 연속 서브 배열 의 최소 곱 하기.f[i]=max(nums[i]*f[i-1],nums[i],nums[i]*g[i-1]) g[i]=min(nums[i]*f[i-1],nums[i],nums[i]*g[i-1])
python 해법:
class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        if not nums:return 0
        N=len(nums)
        f=[0]*N 
        g=[0]*N 
        f[0]=g[0]=res=nums[0]
        for i in range(1,N):
            f[i]=max(f[i-1]*nums[i],nums[i],g[i-1]*nums[i])
            g[i]=min(f[i-1]*nums[i],nums[i],g[i-1]*nums[i])
            res=max(res,f[i])
        return res

자바 해법:
class Solution {
    public int maxProduct(int[] nums) {
        if (nums ==null || nums.length==0)  return 0;
        int res=nums[0];
        int pre_max=nums[0];
        int pre_min=nums[0];
        for (int i=1;i<nums.length;i++){
            int cur_max=Math.max(Math.max(pre_max*nums[i],pre_min*nums[i]),nums[i]);
            int cur_min=Math.min(Math.min(pre_max*nums[i],pre_min*nums[i]),nums[i]);
            res=Math.max(res,cur_max);
            pre_max=cur_max;
            pre_min=cur_min;
        }
        return res;
    }
}

좋은 웹페이지 즐겨찾기