力扣(LeetCode)寻找数组的中心索引 个人题解

给定一个整数类型的数组 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]的整数。

拿到题目,第一想法是使用两个数组分别记录左边往右加的值和右边往左加的值,并记录在数组中,当两个值相等时,输出正确的索引。

代码如下:

class Solution {
    public int pivotIndex(int[] nums) {
        int len=nums.length;
        int[] left=new int[len];
        int[] right=new int[len];
        left[0]=nums[0];
        right[len-1]=nums[len-1];
        for(int i=1;i<len;i++)
        {
            left[i]=left[i-1]+nums[i];
        }
        for(int i=len-2;i>=0;i--)
        {
            right[i]=right[i+1]+nums[i];
        }
        for (int i=0;i<len;i++) {
            if(left[i]==right[i])
                return i;
        }
        return -1;
    }
}

后面参考了评论区,找到了个更优秀的做法,避开了多开辟两个数组的麻烦。那就是根据索引实时修改左边的值和右边的值的取值,如果相等直接返回答案。如果直到循环结束也没有遇到相等的则返回-1。

这样做是上一种写法的优化,省去了开辟数组用的内存空间。当然这里要注意左值和右值加减的顺序。

代码如下:

class Solution {
    public int pivotIndex(int[] nums) {
        int len=nums.length;
        int right = 0;
        int left = 0 ;
        for (int i : nums) {
            right+=i;
        }
        for(int i=0;i<len;i++)
        {
            right-=nums[i];
            if(left==right)
                return i;
            left+=nums[i];
        }
        return -1;
    }
}

原文地址:https://www.cnblogs.com/axiangcoding/p/10415888.html

时间: 2024-10-09 00:37:49

力扣(LeetCode)寻找数组的中心索引 个人题解的相关文章

寻找数组的中心索引

Given an array of integers nums, write a method that returns the "pivot" index of this array. We define the pivot index as the index where the sum of the numbers to the left of the index is equal to the sum of the numbers to the right of the ind

LeetCode724 寻找数组的中心索引

给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不存在中心索引,那么我们应该返回 -1.如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个. 示例 1: 输入: nums = [1, 7, 3, 6, 5, 6] 输出: 3 解释: 索引3 (nums[3] = 6) 的左侧数之和(1 + 7 + 3 = 11),与右侧数之和(5 + 6 = 11)相等. 同

1068. 寻找数组的中心索引

1068. 寻找数组的中心索引 中文English 给定一个整数数组nums,编写一个返回此数组的“中心索引”的方法. 我们将中心索引定义为:中心索引左边的数字之和等于中心索引右边的数字之和. 如果不存在这样的中心索引,我们应该返回-1. 如果有多个中心索引,则应返回最左侧的那个. 样例 样例1: 输入: nums = [1, 7, 3, 6, 5, 6] 输出: 3 解释: 索引3 (nums[3] = 6)左侧所有数之和等于右侧之和. 并且3是满足条件的第一个索引. 样例2: 输入: num

力扣LeetCode,两个数组的交集 II

1.给定两个数组,编写一个函数来计算它们的交集. 示例 1: 1 输入: nums1 = [1,2,2,1], nums2 = [2,2] 2 输出: [2,2] 示例 2: 1 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 2 输出: [4,9] 说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致. 我们可以不考虑输出结果的顺序. 进阶: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多

力扣 删除排序数组中的重复项

1. 我的笨比做法 将整个数组平移 (太笨比了) 2. 实际上 本题的关键只要把不同的元素移到数组的左侧就行 原文地址:https://www.cnblogs.com/TsinghuaComing/p/12254902.html

LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 . 你可以假设数组中不存在重复的元素. 你的算法时间复杂度必须是 O(log n) 级别. 英文:Suppose an array sorted i

LeetCode第三十五题-寻找数组中对应目标值的首尾索引

Search Insert Position 问题简介:寻找数组中元素与target的关系 注: 1.target小于数组所有元素时返回0 2.target大于数组所有元素时返回数组长度 3.target不包含于数组元素中,但取值区间在其中,返回对应的索引 举例: 1: 输入: [1,3,5,6], 5 输出: 2 2: 输入: [1,3,5,6], 2 输出: 1 3: 输入: [1,3,5,6], 7 输出: 4 4: 输入: [1,3,5,6], 0 输出: 0 解法一:比较简单的解法就是

LeetCode寻找两个有序数组的中位数

题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3]nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2]nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 来源:力扣(LeetCode) 链接:https://leetcode-cn.

力扣题目汇总(加一,旋转数组,整数反转)

力扣题目汇总(加一,旋转数组,整数反转) 加一 1.题目描述 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123. 示例 2: 输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321. 2.解题思路 #错误思路 列表最后一位加1,判断最后