데이터 구조 및 알고리즘 인터뷰 질문: 정수 배열 숫자가 주어지면 최대 합계가 있는 연속 하위 배열(하위 배열에는 하나 이상의 요소가 포함됨)을 찾고 최대 합계를 반환합니다.
소개: 정수 배열 nums가 주어지면 합계가 최대인 연속 하위 배열(하위 배열에는 적어도 하나의 요소가 포함됨)을 찾고 최대 합계를 반환합니다.
알고리즘의 구현 아이디어는 다음과 같습니다.
- 변수를 사용하여
ans
최종 답을 저장하고 변수를 사용하여cur
연속 하위 배열의 현재 합계를 저장합니다. - 전체 배열을 트래버스하고 각 숫자에 대해
cur
자체와(cur + nums[i])
사이의 더 큰 값 으로 업데이트합니다.cur
보다 크면 로 업데이트ans
됩니다 .ans
cur
- 배열을 순회한 후
ans
가장 큰 하위 배열 합계로 반환합니다.
다음은 자세한 설명과 함께 C++를 사용하여 가장 큰 하위 배열 합계를 찾는 코드입니다.
#include <iostream>
#include <vector>
using namespace std;
int maxSubArray(vector<int>& nums) {
int ans = nums[0]; // 初始化最终答案
int cur = nums[0]; // 初始化当前连续子数组
for (int i = 1; i < nums.size(); ++i) {
cur = max(nums[i], cur + nums[i]); // 更新当前连续子数组和
ans = max(ans, cur); // 更新最终答案
}
return ans;
}
int main() {
vector<int> nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int ans = maxSubArray(nums);
cout << ans << endl; // 6
return 0;
}
ans
알고리즘은 전체 배열을 순회 하고 지금까지 발견된 최적의 연속 하위 시퀀스의 합을 나타내는 두 변수의 합을 유지하며 cur
, 이는 num[i]로 끝나는 연속 하위 배열의 합입니다. 각 순회에서 현재 값 num[i]와 num[i]+cur 사이의 더 큰 값으로 cur를 업데이트하고 현재 하위 배열 msum[i]의 합을 찾아 ans와 비교하고 ans에 기록합니다. 결국 반환 답변으로 답변합니다. 루프 레이어가 하나뿐이므로 이 알고리즘의 시간 복잡도는 O(n)입니다.ans
cur
- 자바 버전
import java.util.Arrays;
public class Main {
public static int maxSubArray(int[] nums) {
int ans = nums[0]; // 初始化最终答案
int cur = nums[0]; // 初始化当前连续子数组
for (int i = 1; i < nums.length; ++i) {
cur = Math.max(nums[i], cur + nums[i]); // 更新当前连续子数组和
ans = Math.max(ans, cur); // 更新最终答案
}
return ans;
}
public static void main(String[] args) {
int[] nums = {
-2, 1, -3, 4, -1, 2, 1, -5, 4};
int ans = maxSubArray(nums);
System.out.println(ans); // 6
}
}