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]]
  • 相关阅读:
    powerdesigner流程图库看不到了palette视图,palette视图没有了
    IE的getelementbyid(elementid)方法的使用(转)
    QTP的那些事通过html标签的属性获取对象(类似onclick的属性)
    oracle语句详解group by语句解答
    oracle中的decode的使用
    oracle中的trunc函数操作
    QTP的那些事—WMI+SQL分析查询工具
    VBS获取毫秒的时间方法整理
    VBS输出双引号””
    VBSEdit工具学习深入
  • 原文地址:https://www.cnblogs.com/onenoteone/p/12441719.html
Copyright © 2011-2022 走看看