百度&必应权4, 日IP8000. 查看详情
自助收录

寻找数组的中心下标

算法刷题2年前 (2023)更新 江南白衣
390 0 0
寻找数组的中心下标

题目:寻找数组的中心下标
描述:给定一个整数数组nums,请编写一个能够返回数组“中心下标”的方法。
中心下标:中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
要求:如果数组不存在中心下标,返回-1。如果数组有多个中心下标,应该返回最靠近左边的那一个。
举例:输入:[1,7,3,6,5,6],输出:3
注意:中心下标可能出现在数组的两端。
思路:要求有多个中心下标,返回最左边那一个,那么需要我们从左边开始遍历。先统计出整个数组的总和,然后从第一个元素开始叠加,总和递减当前元素,叠加递增当前元素,直到两个值相等。

package od;

import java.util.Arrays;

/**
 * 寻找数组的中心索引
 * 给定一个整数数组nums,请编写一个能够返回数组“中心下标”的方法
 * 原文地址:https://www.codernav.com/2799.html
 */
public class Odtest10 {
    public static void main(String[] args) {
        int index = f(new int[]{1, 7, 3, 6, 5, 6});
        int index1 = f1(new int[]{1, 7, 3, 6, 5, 6});
        System.out.println(index);
        System.out.println(index1);
    }

    /**
     * 1、先统计出整个数组的总和,然后从第一个元素开始叠加
     * 2、总和递减当前元素,叠加递增当前元素,知道两个值相等
     */
    private static int f(int[] nums) {
        int total = Arrays.stream(nums).sum();
        int left = 0;
        for (int i = 0; i < nums.length; i++) {
            if (left + nums[i] == total - left) {
                return i;
            }
            left += nums[i];
        }
        return -1;
    }

    public static int f1(int[] nums) {
        int sum1 = Arrays.stream(nums).sum();
        int sum2 = 0;
        for (int i = 0; i < nums.length; i++) {
            sum2 += nums[i];
            if (sum1 == sum2) {
                return i;
            }
            sum1 = sum1 - nums[i];
        }
        return -1;
    }
}

 

© 版权声明

相关文章

暂无评论

暂无评论...