前缀和(简单算法题)

1.给你一个整数数组 nums ,请计算数组的 中心下标 

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

将数组所有元素之和设出为a,设左侧元素之和为sum,那么右侧元素之和为a-sum-nums[i],利用左右元素相等有a-sum-nums[i]==sum。所以当 2*sum==a-nums[i]时,返回元素i的值。

class Solution {
    public int pivotIndex(int[] nums) {
        int a=Arrays.stream(nums).sum();//a:数组所有元素之和
        int sum=0;//sum:左侧元素之和
        for(int i=0;i<nums.length;i++){
            if(2*sum==a-nums[i]){
                return i;
            }
            sum+=nums[i];
            }
            return -1;
        }

    }

2.给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。

子数组 是数组的 连续 部分。

令 P[i]=nums[0]+nums[1]+…+nums[i];连续子数组的和为sum(i,j)=P[j]-P[i-1],判断和是否能够被k整除的办法就是令(P[j]-P[i-1])%k==0,即P[j]%k==0;P[i-1]%k==0(同余定理:数论中的重要概念。给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系)。

利用哈希表(HashTable):(4条消息) 哈希表(HashTable)_吃米饭的博客-CSDN博客

class Solution {
    public int subarraysDivByK(int[] nums, int k) {
        int n=nums.length;//数组长度
        int ans=0;//子数组个数
        int[] sum=new int[n+1];//各个子数组的和

        for(int i=0;i<n;i++){
            sum[i+1]=sum[i]+nums[i];//子数组中后一个元素的和等于前一个元素的值加上A中元素的值

        }
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                int a=sum[j]-sum[i];
                if(a%k==0){
                    ans++;
                }
            }

        }
        return ans;
      
    }
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值