leetcode 123. 주식 매매 적기 III

5788 단어 동적 계획
배열 을 지정 합 니 다. 그 i 번 째 요 소 는 주어진 주식 이 i 일 째 가격 입 니 다.당신 이 얻 을 수 있 는 최대 이윤 을 계산 하기 위해 알고리즘 을 설계 하 세 요.너 는 최대 두 건의 거래 를 완성 할 수 있다.주의: 당신 은 여러 가지 거래 에 동시에 참여 할 수 없습니다.예 1: 입력: [3, 3, 5, 0, 0, 3, 1, 4] 수출: 6 설명: 4 일 (주식 가격 = 0) 에 매입 하고 6 일 (주식 가격 = 3) 에 판매 하면 이 거래 소 는 이윤 = 3 - 0 = 3 을 얻 을 수 있다.이 어 7 일 째 (주식 가격 = 1) 에 매 수 했 고 8 일 째 (주식 가격 = 4) 에 팔 았 으 며 이 거래 소 는 이익 = 4 - 1 = 3 을 얻 을 수 있 었 다.예 2: 입력: [1, 2, 3, 4, 5] 수출: 4 해석: 첫날 (주식 가격 = 1) 에 매입 하고 5 일 (주식 가격 = 5) 에 매각 하면 이 거래 소 는 이윤 = 5 - 1 = 4 를 얻 을 수 있다.첫날 과 다음날 잇달아 주식 을 사서 팔 지 않도록 주의해 라.여러 거래 에 동시에 참여 한 것 이기 때문에, 당신 은 다시 사기 전에 이전의 주식 을 팔 아야 합 니 다.예 3: 입력: [7, 6, 4, 3, 1] 수출: 0 해석: 이 상황 에서 거래 가 완성 되 지 않 았 기 때문에 최대 이윤 은 0 이다.
  • 첫 번 째 방법 은 딱딱 한 카드 가 지나 간 것 이다.
  • dp [i] [0] 은 i 일 에 내 가 최대 이윤 을 거래 했다 고 밝 혔 다.dp [i] [1] 은 i 일 에 나 는 두 건의 최대 이윤 을 거래 했다 고 밝 혔 다.
  • 0 ~ i - 1 을 옮 겨 다 니 며, dp {i, 0} = max {dp {i, 0}, max {p [i] - p [j], dp {j, 0}}}. j 일 째 주식 을 거래 할 때 p [i] - p [j] 를 선택 할 수 있 습 니 다. 거래 하지 않 으 면 i 일 째 이윤 은 dp [j] 입 니 다.
  • dp {i, 1} 도 차이 가 많 지 않 습 니 다. dp {i, 1} = max {dp {i, 1}, max {p [i] - p [j] + dp {j - 1, 0}, dp {j, 1}}} j 일 째 주식 을 거래 할 수 있 습 니 다. 그러면 이날 이윤 은 p [i] - p [j] + dp [j - 1] [0] 입 니 다. 이 날 주식 을 거래 하지 않 으 면 i 일 째 이윤 은 dp [j] [1] 입 니 다.
  • 2 차원 배열 카드 는 마지막 사례 에 불과 하 다. 나 는 2 차원 배열 로 위의 상황 을 모 의 한 결과 겨우 걸 렸 다.
  • class Solution {
        public int maxProfit(int[] prices) {
            if(prices.length==0){
                return 0;
            }
            /*int[][] dp=new int[prices.length][2];
            for (int i=0;i
            int[] dp1=new int[prices.length];
            int[] dp2=new int[prices.length];
    
            for (int i=0;ifor(int j=0;j1<0?0:dp1[j-1]),
                            dp2[j]
                    ));
                }
            }
            return Math.max(dp2[prices.length-1],dp1[prices.length-1]);
        }
    }
  • 법 2: p 배열 을 미리 처리 하고 차 이 를 취하 여 2 단 으로 나 누 어 [0, mid] 와 [mid + 1, end) 를 각각 최대 필드 와 처리 합 니 다.
  • public int maxProfit(int[] prices) {
            if(prices.length==0){
                return 0;
            }
            int[] ex=new int[prices.length];
            for(int i=1;i1];
            }
            int ans=0;
            for(int i=0;iint fs=0;
                int fm=0;
                for(int j=0;j<=i;++j){
                    fs=Math.max(ex[j],fs+ex[j]);
                    fm=Math.max(fm,fs);
                }
                int ss=0;
                int sm=0;
                for(int j=i+1;jreturn ans;
        }
  • 법 3: i1 은 1 차 매입 i2 는 2 차 매입 o1 은 1 차 매도 o2 는 2 차 매도
  • public int maxProfit(int[] prices) {
            if(prices.length==0){
                return 0;
            }
            int i1,i2,o1,o2;
            i1=Integer.MIN_VALUE;
            i2=Integer.MIN_VALUE;
            o1=0;
            o2=0;
            for(int i=0;ireturn o2;
        }

    좋은 웹페이지 즐겨찾기