데이터 구조 및 알고리즘 인터뷰 질문: 정수 배열 숫자가 주어지면 최대 합계가 있는 연속 하위 배열(하위 배열에는 하나 이상의 요소가 포함됨)을 찾고 최대 합계를 반환합니다.

데이터 구조 및 알고리즘 인터뷰 질문: 정수 배열 숫자가 주어지면 최대 합계가 있는 연속 하위 배열(하위 배열에는 하나 이상의 요소가 포함됨)을 찾고 최대 합계를 반환합니다.

소개: 정수 배열 nums가 주어지면 합계가 최대인 연속 하위 배열(하위 배열에는 적어도 하나의 요소가 포함됨)을 찾고 최대 합계를 반환합니다.

알고리즘의 구현 아이디어는 다음과 같습니다.

  1. 변수를 사용하여 ans최종 답을 저장하고 변수를 사용하여 cur연속 하위 배열의 현재 합계를 저장합니다.
  2. 전체 배열을 트래버스하고 각 숫자에 대해 cur자체와 (cur + nums[i])사이의 더 큰 값 으로 업데이트합니다. cur보다 크면 업데이트 ans됩니다 .anscur
  3. 배열을 순회한 후 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)입니다.anscur

  • 자바 버전
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
    }
}

추천

출처blog.csdn.net/qq_51447496/article/details/131170804