막무가내로 삽질하는 알고리즘

MaximumSubArray

Jungsoomin :) 2020. 11. 3. 23:01
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum. Example: Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.

 

  • 기본 합산 값과 대비해서 다른 원소들의 합산 값을 max 로 비교
  • 마지막 수에 대한 고려가 없으므로 마지막 수 비교.
private static int solve(int[] nums) {
		int max = 0;
		for(int i=0; i<nums.length; i++) {
			int sum = 0;// 합계는 매 원소가 올때마다 초기화되어야함
			sum = nums[i];//첫 수 대입
			for(int j=i +1; j<nums.length; j++) {
				sum = sum + nums[j];
				max = Math.max(max, sum);
			}
		}
		
		//마지막 수 고려
		max = Math.max(max, nums[nums.length-1]);
		
		return max;
		
	}

풀이

 

  • 첫 원소의 부가 배열이나 max 치는 전부 첫 원소 이므로 첫원소는 그대로 대입해주면된다.
  • 기존 원소와 배열의 합산 값을 비교 함
  • max 치와 비교함

시작부터 구할 수 있는 가장 큰 수를 구하고, 순환 원소와 합산하거나, 순환원소보다 작은지 확인

순환원소가 크다면 자연스럽게 시작 수는 순환원소가 됨 그 이후에 다음 순환원소와 합산.

//모든 배열들의 원소 합 중 가장 큰 수를 구해야함
	private static int solve(int[] nums) {
		 
		// 알고리즘의 처음은 언제나 그릇
		int max = 0;
		int sum = 0;
		
		// 첫 원소는 max 치 합산, 서브 배열 치 는 전부 첫원소로 떨어짐
		sum = nums[0];
		max = nums[0];
		
		for(int i=1; i<nums.length; i++) {
			// 첫 원소의 서브배열은 구했으니, 다음 원소나, 다음 원소와 나머지 원소의 합산 값 을 검토해야함.
			sum = Math.max(nums[i], sum + nums[i]);
			// max 와 비교
			max = Math.max(sum, max);
		}
		
		return max;
	}

'막무가내로 삽질하는 알고리즘' 카테고리의 다른 글

Find Anagrams Mapping  (0) 2020.11.03
Longest Substring With At Most Two Distinct  (0) 2020.10.26
UniqueEmailAddresses  (0) 2020.10.25
PlusOne  (0) 2020.10.25
KClosest  (0) 2020.10.25