LeetCode100-560和為K的子數組

本文基于各個大佬的文章

上點關注下點贊,明天一定更燦爛!


前言

????????Python基礎好像會了又好像沒會,所有我直接開始刷leetcode一邊抄樣例代碼一邊學習吧。本系列文章用來記錄學習中的思考,寫給自己看的,也歡迎大家在評論區指導~

????????您的每一條評論都會讓我更有學習的動力。


一、分析題目

本題目分組是【子串】

子串(Substring)?是指字符串中連續的字符序列,由原字符串中任意位置開始、任意位置結束的連續字符組成。

示例:對于字符串 "abcde"

  • 長度為 1 的子串:"a", "b", "c", "d", "e"
  • 長度為 2 的子串:"ab", "bc", "cd", "de"
  • 長度為 3 的子串:"abc", "bcd", "cde"
  • 以此類推,最長子串是原字符串本身

子串 vs 子序列

子串是連續的,子序列可以是非連續的但保持順序。

特性子串(Substring)子序列(Subsequence)
連續性必須連續可以不連續
字符順序保持原順序保持原順序
數量n (n+1)/2 個非空子串2?-1 個非空子序列
示例("abc")"a", "b", "c", "ab", "bc", "abc""a", "b", "c", "ab", "ac", "bc", "abc”

本題的題目是子數組,那么他們兩者的關系是什么呢

  • 子串:用于字符串,由字符組成的連續序列
  • 子數組:用于數組,由元素組成的連續序列

二、思路以及代碼

思路:子數組是由元素組成的連續序列,可以借助滑動窗口,而且是長度可變的滑動窗口

class Solution:def subarraySum(self, nums: List[int], k: int) -> int:sum=0left=0count=0for right in range(len(nums)):sum+=nums[right]while sum>k and left<=right:sum-=nums[left]left+=1if sum==k:count+=1return count

提交之后答案是錯誤的,我重新回去看了題目要求,要求數組的數字可能含有負數,所有我這個辦法是不能這么寫的。

看看其他辦法。問了一下deep老師,老師說因為數組不是非負數,所有負數可能會導致窗口內數字和變大或者變小,移動策略無法處理。推薦的方法是使用前綴和+哈希表(字典)實現。

我們先來了解一下什么是前綴和吧。

前綴和的概念:前綴和是一種預處理技巧,用于快速計算數組中某段子數組的元素的總和。

  • 定義:對于一個數組?nums,它的前綴和數組?prefix_sums?的定義如下:

    • prefix_sums[i]?=?nums[0] + nums[1] + ... + nums[i]i從0開始。
      nums = [1, 2, -1, 3, 4]
      prefix_sums = [1, 3, 2, 5, 9]  # 計算方法: 1, 1+2, 1+2-1, 1+2-1+3, 1+2-1+3+4
      

對于這個題目,我們可以設置一個哈希表,哈希表的key是前綴和,value是這個前綴和出現的次數。也是就我們想要求得前綴和為k,然后value是k出現的次數,也就是我們最后求的子串組數。

from typing import Listdef subarraySum(nums: List[int], k: int) -> int:count = 0prefix_sum = 0prefix_sums = {0: 1}   # 初始化,前綴和為0時出現一次(代表空子數組的和為0)for num in nums:prefix_sum += num # 計算當前的前綴和# 查看是否存在前綴和為 current_sum - kif (prefix_sum - k) in prefix_sums: # 這個時候,如果存在,說明從之前的某個位置到當前位置的和正好是kcount += prefix_sums[prefix_sum - k] # 出現多少次,就加上多少,比如prefix_sums[prefix_sum - k] = 3,說明之前有3個滿足條件的前綴和,所以count要增加3# 更新字典中的前綴和出現次數prefix_sums[prefix_sum] = prefix_sums.get(prefix_sum, 0) + 1 # 更新哈希表,當前的前綴和出現了多少次return count

成功通過

三、本題收獲

prefix_sums[prefix_sum] = prefix_sums.get(prefix_sum, 0) + 1

prefix_sums?字典中獲取鍵?prefix_sum?對應的值。

如果?prefix_sum?作為鍵存在于字典中,則?get()?方法返回該鍵對應的值(也就是該前綴和出現的次數)。

如果?prefix_sum?作為鍵不存在于字典中,則?get()?方法返回第二個參數的值作為默認值,這里是?0


總結

? ? ? ? 只會打暴力,基礎一團糟,明天再學吧老鐵,別真學會了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93716.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93716.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93716.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PZ-ZU47DR-KFB】璞致FPGA ZYNQ UltraScalePlus RFSOC QSPI Flash 固化常見問題說明

1 Flash 固化Flash 固化需要先生成 BOOT.bin 文件&#xff0c;這邊以裸機的串口工程進行講解如何生成 BOOT.bin 文件及 Flash 固化操作。有讀者會遇到&#xff0c;只使用 PL 端的情況&#xff0c;也需要進行 Flash 固化。我們需要添加 PS 端最小配置&#xff08;包含 Flash 配置…

數據結構:查找表

一、數據結構的概念數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。它不僅僅是存儲數據的方式&#xff0c;更強調數據之間的邏輯關系和操作方法。數據結構主要從以下幾個角度來理解&#xff1a;1. 數據之間的關系邏輯結構&#xff1a;集合結構&#xff1a;元素之…

自建知識庫,向量數據庫 (十)之 文本向量化——仙盟創夢IDE

自建文章向量化技術&#xff1a;AI 浪潮下初學者的進階指南 在人工智能&#xff08;AI&#xff09;蓬勃發展的浪潮中&#xff0c;向量化作為將文本數據轉化為數值向量表示的關鍵技術&#xff0c;成為理解和處理文本的基石。本文將結合給定的代碼示例&#xff0c;深入探討自建文…

數據結構 -- 順序表的特點、操作函數

線性表順序存儲的優缺點優點無需為表中的邏輯關系增加額外的存儲空間&#xff0c;利用連續的內存單元存儲數據&#xff0c;存儲密度高。支持 隨機訪問&#xff0c;通過下標可在 O(1) 時間復雜度內定位元素&#xff08;如數組按索引取值&#xff09;&#xff0c;查詢效率穩定。缺…

反向代理實現服務器聯網

下載腳本&#xff1a;https://gitee.com/995770513/ssh-reverse-socket然后解壓到 D:\Download在本機運行 cd D:\Download\ssh-reverse-socket-master\ssh-reverse-socket-master python socket5_proxy.py --ssh_cmd "xaserver10.150.10.51 -p 22" --socket5_port 78…

C語言關于函數傳參和返回值的一些想法2(參數可修改的特殊情況)

我最近寫了一篇文章名為“C語言關于函數傳參和返回值的一些想法”&#xff08;C語言關于函數傳參和返回值的一些想法-CSDN博客&#xff09;&#xff0c;里面提到了一種觀點就是傳參的參數在函數體內部是只讀的&#xff0c;不能寫它&#xff0c;因為如果寫了&#xff0c;也就是污…

前端AI對話功能實現攻略

一、對話內容渲染 在前端頁面的 AI 對話場景中&#xff0c;對話內容的渲染效果直接影響用戶的閱讀體驗和交互效率。合理選擇對話格式、優化流式對話呈現、嵌入自定義內容以及實現語音播報等功能&#xff0c;是提升整體體驗的關鍵。 對話格式選擇 MarkDown 作為一種輕量級標記語…

深入理解Redis持久化:讓你的數據永不丟失

1 Redis持久化概述 1.1 什么是Redis持久化 Redis作為一個高性能的內存數據庫,默認情況下數據存儲在內存中,這意味著一旦服務器重啟或發生故障,內存中的數據將會丟失。為了保證數據的持久性和可靠性,Redis提供了持久化機制,將內存中的數據保存到磁盤中。 持久化是Redis實…

IC驗證 AHB-RAM 項目(二)——接口與事務代碼的編寫

目錄準備工作接口相關代碼編寫事務相關代碼編寫準備工作 DVT&#xff08;Design and Verification Tools&#xff09;是一款專門為 IC 驗證打造的 IDE 插件&#xff0c;可以理解為智能的 Verilog/System Verilog 編輯器&#xff0c;在 VS Code、Eclipse 軟件中使用。 接口相關…

基于Spring Boot的智能民宿預訂與游玩系統設計與實現 民宿管理系統 民宿預訂系統 民宿訂房系統

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

大模型的底層運算線性代數

深度學習的本質是用數學語言描述并處理真實世界中的信息&#xff0c;而線性代數正是這門語言的基石。它不僅提供了高效的數值計算工具&#xff0c;更在根本上定義了如何以可計算、可組合、可度量的方式表示和變換數據。 1 如何描述世界&#x1f4ca; 真實世界的數據&#xff08…

Rust 中 i32 與 *i32 的深度解析

Rust 中 &i32 與 *i32 的深度解析 在 Rust 中&#xff0c;&i32 和 *i32 是兩種完全不同的指針類型&#xff0c;它們在安全性、所有權和使用方式上有本質區別。以下是詳細對比&#xff1a; 核心區別概覽 #mermaid-svg-rCa8lLmHB7MK9P6K {font-family:"trebuchet ms…

【PyTorch項目實戰】OpenNMT本地機器翻譯框架 —— 支持本地部署和自定義訓練

文章目錄一、OpenNMT&#xff08;Neural Machine Translation&#xff0c;NMT&#xff09;1. 概述2. 核心特性3. 系統架構4. 與其他翻譯工具的區別二、基于 OpenNMT-py 的機器翻譯框架1. 環境配置&#xff08;以OpenNMT-py版本為例&#xff09;&#xff08;1&#xff09;pip安裝…

基于prompt的生物信息學:多組學分析的新界面

以前總以為綜述/評論是假大空&#xff0c;最近在朋友的影響下才發現&#xff0c;大佬的綜述/評論內容的確很值得一讀&#xff0c;也值得分享的。比如這篇講我比較感興趣的AI輔助生信分析的&#xff0c;相信大家都是已經實踐中用上了&#xff0c;看看大佬的評論&#xff0c;拓寬…

Nacos-8--分析一下nacos中的AP和CP模式

Nacos支持兩種模式來滿足不同場景下的需求&#xff1a;AP模式&#xff08;強調可用性&#xff09;和CP模式&#xff08;強調一致性&#xff09;。 這兩種模式的選擇主要基于CAP理論&#xff0c;該理論指出在一個分布式系統中&#xff0c;無法同時保證一致性&#xff08;Consist…

水閘安全監測的主要核心內容

水閘安全監測是指通過一系列技術手段和管理措施&#xff0c;對水閘的結構狀態、運行性能及環境條件進行實時或定期的觀測與評估&#xff0c;以確保水閘在設計壽命期內的安全性和可靠性。其核心目標是及時發現潛在的安全隱患&#xff0c;防止事故發生&#xff0c;保障水利工程的…

嵌入式系統學習Day19(數據結構)

數據結構的概念&#xff1a; 相互之間存在一種或多種特定關系的數據元素的集合。數據之間關系&#xff1a;邏輯關系&#xff1a;集合&#xff0c;線性&#xff08;1對1&#xff0c;中間位置的值有且僅有一個前驅&#xff0c;一個后繼&#xff09;&#xff0c;樹&#xff08;1對…

Pandas中數據清理、連接數據以及合并多個數據集的方法

一、簡介1.數據清理的重要性&#xff1a;在進行數據分析前&#xff0c;需進行數據清理&#xff0c;使每個觀測值成一行、每個變量成一列、每種觀測單元構成一張表格。2.數據組合的必要性&#xff1a;數據整理好后&#xff0c;可能需要將多張表格組合才能進行某些分析&#xff0…

JavaSSM框架從入門到精通!第二天(MyBatis(一))!

一、 Mybatis 框架1. Mybatis 框架簡介Mybatis 是 apache 的一個開源項目&#xff0c;名叫 iBatis &#xff0c;2010 年這個項目由 apache 遷移到了 google&#xff0c;并命名為 Mybatis&#xff0c;2013 年遷移到了 GitHub&#xff0c;可以在 GitHub 下載源碼。2. Mybatis 的下…

Linux下Mysql命令,創建mysql,刪除mysql

在 Linux 系統下&#xff0c;您可以通過命令行來創建和刪除 MySQL 數據庫。以下是詳細的操作步驟&#xff0c;包括創建和刪除數據庫、用戶&#xff0c;以及常見的相關管理命令。1. 登錄 MySQL在執行任何 MySQL 操作之前&#xff0c;需要先登錄 MySQL。1.1 使用 root 用戶登錄 M…