知识储备--基础算法篇-子串

1.子串

1.1第560题-和为k的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 

示例 1:

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

一开始想用滑动窗口,但是在运行过程中碰到了很多不好处理的例子,不好弄。就直接看解析了,决定用ij范围遍历,结果超时。

class Solution(object):
    def subarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        n = len(nums)
        cur_arr = []
        result = 0
        cur_sum = -100000000
        last_sum = 0
        sum_nums = 0
        for i in range(n):
            sum_nums += nums[i]
        cur_sum = sum_nums
        sum_temp = sum_nums
        for i in range(n):
            if i != 0:
                sum_temp -= nums[i-1]
            cur_sum = sum_temp
            for j in reversed(range(i,n)):
                if cur_sum == k:
                    result += 1
                cur_sum -= nums[j]

        return result

看了解析,说实话挺不好想的

class Solution(object):
    def subarraySum(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        n = len(nums)
        cur_arr = []
        result = 0
        last_sum = 0
        sum_nums = 0
        # 必须初始化为0:1,不然sum_nums-k=0时,result就不能加一了
        dic = {0:1}
        for i in range(n):
            # 求前缀和
            sum_nums += nums[i]
            # 如果字典中存在sum_nums-k,则说明sum_nums对应的i与sum_nums-k对应的i之间和为k
            # 如果sum_nums-k的键值不唯一,就表示有多个i的前缀和为sum_nums-k
            # 这时result就加上键值
            result += dic.get(sum_nums-k, 0)
            # 最后把该i的前缀和加入到字典中,若已存在则键值加一
            dic[sum_nums] = dic.get(sum_nums, 0) + 1
            print(dic, result)

        return result

知识储备--基础算法篇-子串_第1张图片

1.2第239题-滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 

心得:思路感觉挺简单,就是滑动窗口,直接写出来,不过超时了。

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        result = []
        cur_win = []
        for i in range(k-1):
            cur_win.append(nums[i])
        for i in range(len(nums)-k+1):
            cur_max = -100000
            cur_win.append(nums[i+k-1])
            for j in range(k):
                if cur_max < cur_win[j]:
                    cur_max = cur_win[j]
            # cur_max = max(cur_win)
            result.append(cur_max)
            cur_win = cur_win[1:]

        return result

解析有点复杂。

你可能感兴趣的:(算法)