JS 는 어떻게 배열 중심 색인 과정 을 찾 습 니까?

정수 형식의 배열 nums 를 지정 합 니 다.배열 의'중심 색인'을 되 돌 릴 수 있 는 방법 을 만 드 십시오.
우 리 는 이렇게 배열 중심 색인 을 정의 합 니 다.배열 중심 색인 의 왼쪽 모든 요소 에 추 가 된 것 과 오른쪽 모든 요소 에 추 가 된 것 과 같 습 니 다.
만약 배열 에 중심 색인 이 존재 하지 않 는 다 면,우 리 는-1 로 돌아 가 야 합 니 다.만약 배열 에 여러 개의 중심 색인 이 있다 면,우 리 는 가장 왼쪽 에 있 는 것 으로 돌아 가 야 한다.
예시 1:
입력:
nums = [1, 7, 3, 6, 5, 6]
출력:3
설명:
색인 3(nums[3]=6)의 왼쪽 수의 합(1+7+3=11)은 오른쪽 수의 합(5+6=11)과 같다.
또한 3 도 요구 에 부합 되 는 첫 번 째 중심 색인 이다.
예시 2:
입력:
nums = [1, 2, 3]
출력:-1
설명:
배열 에는 이 조건 을 만족 시 키 는 중심 색인 이 존재 하지 않 습 니 다.
설명:nums 의 길이 범 위 는[0,10000]입 니 다.모든 nums[i]는[-1000,1000]의 정수 가 될 것 입 니 다.
우 리 는 먼저 분석 하고 나의 실현 방향 을 말 한 다음 에 다른 사용자 들 의 양질 의 해답 을 공유 합 니 다.
제목 이 전달 하고 자 하 는 의 미 는 사실 명확 하 다.i 에 옮 겨 다 닐 때 i 왼쪽 의 모든 요소(i 포함 되 지 않 음)와 i 오른쪽 에 있 는 모든 요소(i 포함 되 지 않 음)와 같다.옮 겨 다 니 는 과정 에서 만족 하면 i 로 돌아 가 고 만족 하지 않 으 면-1 로 돌아간다.
내 가 제일 먼저 생각 한 것 은 매번 i 를 옮 겨 다 니 며 배열 의 좌 우 를 각각 두 개의 배열 로 나 누 어 비교 하고 만족 하면 i 로 돌아 가 는 것 이다.만약 에 되 돌아 가 는 것 을 찾 지 못 하면-1.

이 문제 의 구 덩이 를 미리 알려 주 고 나의 이해 에 따 르 면 예 를 들 어 하나의 배열[1,-1,1]은 사실 i 가 1 인 상황 만 비교 할 수 있다.
i 가 0 일 때 왼쪽 에 요소 가 존재 하지 않 고 비교 할 필요 가 없 기 때문에 i 가 2 일 때 오른쪽 에 요소 가 없고 비교 할 필요 가 없 기 때문에 제 가 처음에 순환 하 는 조건 은:for (var i = 1; i < nums.length - 1; i++) {}그리고 제출 하면 끊 어 집 니 다.힌트 는 0 으로 돌아 가 야 합 니 다.-1 이 아니 라 공식 적 인 이해 에 따 르 면 i 가 0 일 때 왼쪽 에 요소 가 없 지만 0(저 는 복 용 했 습 니 다.)입 니 다.

수정 을 통 해 이곳 에서 나의 실현 을 제공 하 는 것 은 비교적 거칠다.

/**
 * @param {number[]} nums
 * @return {number}
 */
var pivotIndex = function(nums) {
  var i = 0,
    //     
    sum_l = 0,
    //     
    sum_r = 0,
    len = nums.length;
  for (; i < len; i++) {
    //   i 0  ,nums[0 - 1] undefined,        NaN
    if(nums[i - 1]){
      sum_l += nums[i - 1];
    };
		//   i       
    nums.slice(i + 1).map(item => {
      sum_r += item;
    });
    //     ,    i
    if (sum_l == sum_r) {
      return i;
    } else {
      //           ,          
      sum_r = 0;
    };
  };
  return -1;
};
제출 해 보 니 시간 이 없어 서....................................................

정말 목숨 을 앗 아 간 알고리즘 을 2S 로...
사실 제목 에 따라 우 리 는 배열 의 모든 요소 의 총 화 는 i+i 왼쪽 과+i 오른쪽 과 같다 는 것 을 알 수 있 기 때문에 여러 가지 공식 을 얻 을 수 있다.

//     = (   - i)  2
sumLeft = (sum - i)/2
//  
sumLeft = sum - i - sumLeft
구현 코드 붙 이기:

/**
 * @param {number[]} nums
 * @return {number}
 */
var pivotIndex = function (nums) {
  var i = 0,
    len = nums.length,
    sum = 0,
    sumLeft = 0;
  //      
  nums.map(item => sum += item);
  //           0   ,  i 0    sumLeft+=nums[i]   
  for (; i < len; i++) {
    if ((sum - nums[i]) / 2 === sumLeft) {
      return i;
    };
    sumLeft += nums[i];
  };
  return -1;
};
사실 유일 하 게 주의해 야 할 것 은 바로 제 가 앞에서 말 한 구덩이 입 니 다.i 가 0 일 때 왼쪽 은 0 입 니 다.그래서 우 리 는 한 번 판단 한 후에 sumLeft+=nums[i]를 실 행 했 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기