zoukankan      html  css  js  c++  java
  • 数组-(Zero Sum Subarray)返回数组中和为某个数的子串数组

    '''
    Given an integer array, find a subarray where the sum of numbers is zero.
    Your code should return the index of the first number and the index of the last number.
    
    Example
    Given [-3, 1, 2, -3, 4], return [0, 2] or [1, 3].
    
    Note
    There is at least one subarray that it's sum equals to zero.
    '''
    
    '''
    # 1 两个for循环穷举
    class Solution:
        def call(self, arr, sum_obj_elem, once=True):
            size = len(arr)
            result = []
            for i1 in range(size):
                tp = sum_obj_elem
                for i2 in range(i1, size):
                    tp -= arr[i2]
                    if tp == 0:
                        print(i1, i2)
                        result.append([i1, i2])
                        if once:
                            return result
            return result
    
    
    s = Solution()
    print(s.call([-3, 1, 2, -3, 4], 0, False))
    '''
    
    
    # 分奇偶对讨论,奇:按中轴划分-3, 1, 2。偶:按左右划分1, 6, 2, -1, -2, -6
    # 一句话总结:xxxxx子串和为0,只存在奇/偶两个个数情况,所有列举两种情况时从中间展开计算和是否为零即可(奇:1 1 1, 2, -1 -1 -3;偶:1 2 , -1 -2)
    class Solution2:
        def call(self, arr, sum_obj_elem, once=True):
            size = len(arr)
            result = []
            # 计算奇数形式
            for center in range(size):
                if once and len(result) > 0:
                    break
                left_len = center
                right_len = size - 1 - center
                # print(left_len, right_len)
                sum = 0
                left = center
                right = center
                if left_len < right_len:
                    d = left_len
                else:
                    d = right_len
                sum += arr[center]
                while d > 0 and left - 1 > 0 and right + 1 < size:
                    d -= 1
                    left -= 1
                    right += 1
                    sum += arr[left]
                    sum += arr[right]
                    if sum == 0:
                        result.append(arr[left:right + 1])
                        break
            #  计算双数形式1,1,-1,-1
            for center in range(size - 1):
                if once and len(result) > 0:
                    break
                left_len = center + 1
                right_len = size - 1 - center
                d = min(left_len, right_len)
                left = center
                right = center + 1
                # print([left], [right])
                sum = 0
                while d > 0 and left >= 0 and right < size:
                    d -= 1
                    sum += arr[left]
                    sum += arr[right]
                    if sum == 0:
                        result.append(arr[left:right + 1])
                        break
                    left -= 1
                    right += 1
    
            return result
    
    
    s = Solution2()
    print(s.call([5, -3, 1, 2, -3, 4, 1, 6, 2, -1, -2, -6], 0, False))
    
    #[[-3, 1, 2], [1, 2, -3], [1, 6, 2, -1, -2, -6]]
  • 相关阅读:
    Qt音视频开发8-ffmpeg保存裸流
    Qt音视频开发7-ffmpeg音频播放
    Qt音视频开发6-ffmpeg解码处理
    Qt音视频开发5-vlc事件订阅
    Qt音视频开发4-vlc读取和控制
    Qt音视频开发3-vlc录像存储
    Qt音视频开发2-vlc回调处理
    Qt音视频开发1-vlc解码播放
    【日拱一卒】链表——两个有序的链表合并
    osg计算线段与球面的交点
  • 原文地址:https://www.cnblogs.com/onenoteone/p/12441719.html
Copyright © 2011-2022 走看看