프로 그래 밍 의 아름다움 연재 - 연속 서브 그룹 과 최대 값
4626 단어 프로 그래 밍 의 아름다움
정수 배열 을 정 하고 연속 적 인 하위 배열 과 최대 치 를 구 합 니 다. 예 를 들 어 1, 2, 3, 5, - 3, 2 의 최대 치 는 80, - 2, 3, 5, - 1, 2 의 최대 치 는 9 입 니 다.
분석 하 다.
에서 제시 한 알고리즘 은 매우 세련 되 지만 해석 은 비교적 복잡 하 다. 만약 에 '등급 별 조합' 의 측면 에서 이해 하면 매우 편리 하 다.
해법
두 개의 정수 변 수 를 설정 합 니 다: cur 와 sum 은 주어진 배열 에서 모든 요 소 를 순서대로 꺼 내 cur 에 추가 합 니 다. cur < 0 시 cur 를 초기 화 합 니 다.sum 기록 cur 에 나타 난 최대 값:
var cur = array[0]; var sum = cur; for (int i = 1; i < array.Length; i++) { cur = cur < 0 ? array[ i ] : cur + array[ i ]; if (sum < cur) sum = cur; } return sum; 扩展问题二解法
如果要求得到最大和的连续子数组的起始位置,那么通过以上思路就更加容易写出代码:
int start1 = 0, start2 = 0, end = 0; var cur = array[0]; var sum = cur; for (int i = 1; i < array.Length; i++) { if (cur < 0) { cur = array[ i ]; start2 = i; } else cur += array[ i ]; if (sum < cur) { sum = cur; end = i; start1 = start2; } } // [start1, end] 이 예 에서 우 리 는 start 1, start 2 로 시작 위 치 를 기록 하고 end 로 종료 위 치 를 기록 합 니 다.start 2 는 '작업 변수' 에 해당 하 며, start 1 은 역대 최대 와 연속 하위 배열 의 시작 위 치 를 저장 합 니 다.
확장 문제 해법
만약 주어진 것 이 배열 이 앞 뒤 가 연 결 된 순환 배열 이 라면 어떻게 풀 어야 합 니까?먼저 함 수 를 설계 하고 주어진 배열 에서 from 에서 시작 하여 최대 to 로 끝 나 는 최대 와 연속 서브 배열 의 끝 위치, 사고 방향 은 앞의 해법 과 유사 합 니 다.
int MaxSum_Position(int[] array, int from, int to) { int step = Math.Sign(to - from); int end = from; var cur = array[from]; var sum = cur; for (int i = from + step; i != to + step; i += step) { cur += array[ i ]; if (sum < cur) { sum = cur; end = i; } } return end; } 이 함수 가 있 으 면 순환 배열 의 문 제 를 두 가지 상황 으로 나 눌 수 있 습 니 다. 하 나 는 연속 서브 배열 이 0 위 치 를 뛰 어 넘 었 고 하 나 는 뛰 어 넘 지 않 았 습 니 다.
int sum1 = MaxSum(array);// 0 int i = MaxSum_Position(array, 0, array.Length - 1); int j = MaxSum_Position(array, array.Length - 1, 0); int sum2 = 0; if (i > j) j = i + 1; for (int k = 0; k < array.Length; k++) { sum2 += array[ k ]; if (k == i) k = j - 1; // } return Math.Max(sum1, sum2);이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
프로 그래 밍 의 아름다움 - 2 진수 중 1 의 개 수 를 구하 다질문 설명: 한 바이트 (8bit) 의 부호 없 는 정형 변수 에 대해 바 이 너 리 표시 중 '1' 의 개 수 를 구하 고 알고리즘 의 집행 효율 이 가능 한 한 높 아야 한다. 문제 풀이:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.