首页 > 其他分享 >子数组之和

子数组之和

时间:2023-09-27 09:48:21浏览次数:34  
标签:curr nums column sum prefix 数组

子数组之和

题目地址

https://www.lintcode.com/problem/subarray-sum/my-submissions

描述

给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置

样例

样例 1:

输入: [-3, 1, 2, -3, 4]
输出: [0,2] 或 [1,3]
样例解释: 返回任意一段和为0的区间即可。
样例 2:

输入: [-3, 1, -4, 2, -3, 4]
输出: [1,5]

题解-前缀和

class Solution:
    """
    @param nums: A list of integers
    @return: A list of integers includes the index of the first number and the index of the last number
    """
    def subarraySum(self, nums):
        # write your code here
        prefix_dict = {0: -1}
        prefix_sum = 0
        for index, value in enumerate(nums):
            prefix_sum += value
            if prefix_sum in prefix_dict:
                return [prefix_dict.get(prefix_sum) + 1, index]
                
            prefix_dict[prefix_sum] = index
        
        return [-1, -1]

和为K的子数组

描述

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例 1 :

输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

输入:nums = [1,2,3], k = 3
输出:2

说明 :

数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

hash表

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        prefix_sum = {0: 1}
        result = 0
        
        curr = 0
        for num in nums:
            curr += num
            if curr - k in prefix_sum:
                result += prefix_sum[curr - k]
            if curr in prefix_sum:
                prefix_sum[curr] += 1
            else:
                prefix_sum[curr] = 1

        return result

题解

代码更优雅的写法

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        prefix_sum = {0: 1}
        result = 0
        
        curr = 0
        for num in nums:
            curr += num
            result += prefix_sum.get(curr - k, 0)
            prefix_sum.setdefault(curr, 0)
            prefix_sum[curr] += 1

        return result

和为零的子矩阵

题目地址

https://www.lintcode.com/problem/submatrix-sum/description

描述

给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标。

如果有多个答案, 你可以返回其中任意一个.

样例

样例 1:

输入:
[
[1, 5, 7],
[3, 7, -8],
[4, -8 ,9]
]
输出: [[1, 1], [2, 2]]
样例 2:

输入:
[
[0, 1],
[1, 0]
]
输出: [[0, 0], [0, 0]]

题解-前缀和

class Solution:
    """
    @param: matrix: an integer matrix
    @return: the coordinate of the left-up and right-down number
    """
    def submatrixSum(self, matrix):
        # write your code here
        if not matrix or not matrix[0]:
            return None
        
        row_length = len(matrix)
        column_length = len(matrix[0])
        
        for top in range(row_length):
            arr = [0] * column_length
            for down in range(top, row_length):
                prefix_dict = {0: -1}
                prefix_sum = 0
                for column in range(column_length):
                    arr[column] += matrix[down][column]
                    prefix_sum += arr[column]
                    if prefix_sum in prefix_dict:
                        return [[top, prefix_dict[prefix_sum] + 1], [down, column]]
                        
                    prefix_dict[prefix_sum] = column

标签:curr,nums,column,sum,prefix,数组
From: https://www.cnblogs.com/init0ne/p/14694831.html

相关文章

  • 剑指offer(1)数组中重复的数字
    描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1数据......
  • C语言双指针法解决-有序数组的平方
     力扣(LeetCode)官网-全球极客挚爱的技术成长平台/***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intcmp(constvoid*a,constvoid*b){return(*(int*)a)-(*(int*)b);}int*sortedSquares(int*nums,intnumsSize,......
  • 【面试题】Js数组去重都有哪些方法?
    1.indexOf定义:indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。如果没有找到匹配的字符串则返回-1。注意:iindexOf()方法区分大小写。语法:string.indexOf(searchvalue,start)//;searchvalue必需。searchvalue可选参数。返回值:Number//查找指定字符串第一次......
  • JavaScript 终于原生支持数组分组了!
    在日常开发中,很多时候需要对数组进行分组,每次都要手写一个分组函数,或者使用lodash的groupBy函数。好消息是,JavaScript现在正在引入全新的分组方法:Object.groupBy和Map.groupBy,以后再也不需要手写分组函数了,目前最新版本的Chrome(117)已经支持了这两个方法!以前的数组分组假设有一个......
  • 关于keil导出数组、数据全是0解决方法
    最近我在采集spwm的电压,想导出散点用matlab画一下图,就找一些keil导出数据的方法,我到用这种写函数的的方式,结果导出全是0,找了很多帖子都没有解释。后来仔细看看才发现是一个十分低级的错误,在别的帖子上转载的都是printf("%d\n",a[i]);打印的都是整形,而我的数组是float类型,所以......
  • 字符数组和字符串的输入:cin,,getchar,cin.get,cin.geiline
    1#include<iostream>2usingnamespacestd;3intmain()4{5//cin.get输入字符6////charc;7/*while((c=cin.get())!=EOF)8{9cout<<c;10}*/11/*while(cin.get(c))12{13......
  • 合并两个无序数组
    合并两个无序数组现在我有两个无序的数组(长度不相等),我现在想将两个数组合并#include<iostream>#include<vector>usingnamespacestd;vector<int>mergeArrays(vector<int>&arr1,vector<int>&arr2){vector<int>res;inti=0,j=0;//设置......
  • LeetCode54.螺旋数组
    本题关键在于模拟数组螺旋的步骤,使用 flag 二维数组标识矩阵某位置是否被访问过,使用 turn 变量指示当前寻找的方向, turn 为0时,代表向右查找, turn 为1时,代表向下查找, turn 为2时,代表向左查找, turn 为3时,代表向上查找,具体的代码如下:classSolution{publicList<......
  • 随想录Day5|242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
    随想录Day5|242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和 242.有效的字母异位词文章&视频讲解给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。1......
  • 队列环形数组实现两种实现
      1importjava.util.Iterator;//环形队列,数组容量应该比实际需要大一publicclassMain{publicstaticvoidmain(String[]args){ArrayQueue<Integer>a=newArrayQueue<>(10);a.push(1);a.push(2);a.push(3);a.push(4)......