当前位置: 首页 > news >正文

力扣喜刷刷--day1

1.无重复字符的最长子串

知识点:滑动窗口

基本概念

  1. 窗口:窗口是一个连续的子序列,可以是固定长度或可变长度。
  2. 滑动:窗口在数据序列上移动,可以是向左或向右。
  3. 边界:窗口的起始和结束位置。

应用场景

  1. 字符串匹配:如KMP算法中的部分匹配表就是利用滑动窗口来优化字符串搜索。
  2. 最大/最小子数组:例如Kadane算法,通过滑动窗口找到数组中的最大子数组和。
  3. 窗口内元素的统计:如统计窗口内元素的个数、总和、平均值等。
  4. 数据流的实时处理:在数据流中,滑动窗口可以用来处理固定时间范围内的数据。
  5. 滑动窗口协议:在网络通信中,滑动窗口用于流量控制和拥塞避免。

实现方式

  1. 固定窗口:窗口大小不变,通过移动窗口的起始或结束位置来遍历整个数据序列。
  2. 可变窗口:窗口大小可以根据需要变化,通常用于处理动态数据集合。

示例代码(Python)

def max_subarray_sum(nums):max_sum = float('-inf')current_sum = 0start = 0for end in range(len(nums)):current_sum += nums[end]while current_sum > max_sum and start <= end:max_sum = current_sumcurrent_sum -= nums[start]start += 1return max_sum if max_sum != float('-inf') else 0# 使用示例
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(max_subarray_sum(nums))  # 输出应该是6,对应子数组[4, -1, 2, 1]

 

代码:

#include <stdio.h>
#include <string.h>int lengthOfLongestSubstring(char *s) {int n = strlen(s);int charIndex[128]; // ASCII 128字符的索引表for (int i = 0; i < 128; i++) {charIndex[i] = -1; // 初始化索引表为-1}int left = 0, maxLength = 0;for (int right = 0; right < n; right++) {char currentChar = s[right];if (charIndex[currentChar] >= left) {left = charIndex[currentChar] + 1; // 更新左边界}charIndex[currentChar] = right; // 更新当前字符的最新索引int currentLength = right - left + 1;if (currentLength > maxLength) {maxLength = currentLength;}}return maxLength;
}int main() {char s[] = "abcabcbb";int length = lengthOfLongestSubstring(s);printf("最长不重复子串长度是: %d\n", length);return 0;
}

代码解释

  1. 初始化

    • charIndex:一个数组,用于存储每个字符的最新出现位置。我们假定字符串只包含ASCII字符(共128个)。
    • charIndex数组初始化为-1,表示字符尚未出现。
  2. 滑动窗口

    • left:滑动窗口的左边界。
    • maxLength:记录最长子串的长度。
    • 遍历字符串 s 的每个字符,right 表示滑动窗口的右边界。
    • 如果当前字符 s[right]charIndex中的值大于等于 left,说明遇到了重复字符,需要更新左边界 left
    • 将当前字符的索引更新到charIndex中。
    • 计算当前窗口的长度 right - left + 1,并更新 maxLength
  3. 返回结果

    • 遍历完成后,maxLength即为最长不含重复字符的子串的长度。

提交结果


2.前k个高频元素 


知识点: 哈希表和快速排序算法

哈希表(Hash Table)

哈希表是一种数据结构,它提供了快速的数据插入和查找功能。以下是哈希表的一些关键点:

  • 基本思想:哈希表通过使用哈希函数将输入(例如字符串或者数字)映射到一个大数组的索引上,这个数组称为哈希表的“桶”。
  • 哈希函数:哈希函数的设计对于哈希表的性能至关重要,它应该能够均匀地分布元素,以减少冲突。
  • 冲突解决:当两个不同的输入通过哈希函数映射到同一个索引时,称为“冲突”。解决冲突的常见方法包括链地址法(每个桶包含一个链表来存储具有相同哈希值的元素)和开放寻址法(寻找空的数组位置来存储元素)。
  • 动态扩容:随着元素的增加,哈希表可能需要扩容以保持操作的效率,扩容通常涉及到重新计算现有元素的哈希值并将它们重新分配到新的更大的数组中。
  • 时间复杂度:理想情况下,哈希表的插入和查找操作可以达到平均时间复杂度O(1),但在最坏情况下(例如,所有元素都映射到同一个桶中)可能退化到O(n)。

快速排序算法(Quick Sort)

快速排序是一种高效的排序算法,采用分治法的策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。以下是快速排序的一些关键点:

  • 选择基准:算法首先选择一个元素作为“基准”(pivot),然后重新排列数组,使得所有比基准小的元素都在基准的左边,所有比基准大的元素都在基准的右边。
  • 分区操作:通过分区操作,数组被分为两个部分,然后递归地对这两个部分进行快速排序。
  • 递归:递归是快速排序的核心,它将问题分解为更小的子问题,直到子问题足够小,可以直接解决。
  • 时间复杂度:在平均情况下,快速排序的时间复杂度为O(n log n),但在最坏情况下(例如,数组已经排序或所有元素相等)时间复杂度会退化到O(n^2)。
  • 原地排序:快速排序是一种原地排序算法,它不需要额外的存储空间,除了递归调用的栈空间。
  • 稳定性:快速排序不是稳定的排序算法,相同的元素在排序后可能会改变它们原来的顺序。

代码解释 

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int key;int value;struct Node* next;
} Node;Node** createHashTable(int size) {Node** hashTable = (Node**)malloc(sizeof(Node*) * size);for (int i = 0; i < size; i++) {hashTable[i] = NULL;}return hashTable;
}int getHashValue(int key, int size) {return abs(key % size);
}void insert(Node** hashTable, int key, int size) {int index = getHashValue(key, size);Node* node = hashTable[index];Node* prev = NULL;while (node != NULL) {if (node->key == key) {node->value++;return;}prev = node;node = node->next;}Node* newNode = (Node*)malloc(sizeof(Node));newNode->key = key;newNode->value = 1;newNode->next = NULL;if (prev == NULL) {hashTable[index] = newNode;} else {prev->next = newNode;}
}int partition(Node** nums, int left, int right) {int pivot = nums[right]->value;int i = left - 1;for (int j = left; j < right; j++) {if (nums[j]->value >= pivot) {i++;Node* temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}Node* temp = nums[i+1];nums[i+1] = nums[right];nums[right] = temp;return i + 1;
}void quickSort(Node** nums, int left, int right) {if (left < right) {int pivotIndex = partition(nums, left, right);quickSort(nums, left, pivotIndex - 1);quickSort(nums, pivotIndex + 1, right);}
}int* topKFrequent(int* nums, int numsSize, int k, int* returnSize) {int hashSize = numsSize * 2;Node** hashTable = createHashTable(hashSize);for (int i = 0; i < numsSize; i++) {insert(hashTable, nums[i], hashSize);}int uniqueNums = 0;for (int i = 0; i < hashSize; i++) {Node* node = hashTable[i];while (node != NULL) {uniqueNums++;node = node->next;}}Node** frequencyArray = (Node**)malloc(sizeof(Node*) * uniqueNums);int index = 0;for (int i = 0; i < hashSize; i++) {Node* node = hashTable[i];while (node != NULL) {frequencyArray[index++] = node;node = node->next;}}quickSort(frequencyArray, 0, uniqueNums - 1);*returnSize = k;int* result = (int*)malloc(sizeof(int) * k);for (int i = 0; i < k; i++) {result[i] = frequencyArray[i]->key;}return result;
}
  1. 包含标准输入输出头文件stdio.h和标准库头文件stdlib.h

  2. 定义了一个结构体Node,包含一个整数key,一个整数value和一个指向Node的指针next

  3. 定义了一个函数createHashTable,它接受一个整数size作为参数,创建一个大小为size的哈希表,并初始化所有元素为NULL

  4. 定义了一个辅助函数getHashValue,它接受一个整数key和一个整数size,返回哈希表中对应的索引位置。

  5. 定义了一个insert函数,它接受一个哈希表指针、一个整数key和一个整数size,用于将键值对插入到哈希表中。如果键已经存在,则增加其值。

  6. 定义了一个partition函数,用于快速排序中的分区操作。

  7. 定义了一个quickSort函数,用于对节点数组进行快速排序。

  8. 定义了主要的函数topKFrequent,它接受一个整数数组nums、数组的大小numsSize、需要找出的前k个最频繁元素的数量以及一个指向整数的指针returnSize。这个函数首先创建一个哈希表,然后统计每个元素出现的次数,接着将统计结果放入一个数组中,对数组进行快速排序,最后返回出现次数最多的前k个元素。

 提交结果

3.百马百担

100 匹马驮 100 担货,已知一匹大马驮 3 担,一匹中马驮 2 担,两匹小马驮 1 担。试编写 程序计算大、中、小马的所有可能组合数目。

#include <stdio.h>int main() {int count = 0;for (int big = 0; big <= 100 / 3; big++) {for (int medium = 0; medium <= 100 / 2; medium++) {int small = 100 - big - medium;if ((3 * big + 2 * medium + small) == 100) {// Valid combination foundprintf("大马:%d 匹,中马:%d 匹,小马:%d 匹\n", big, medium, small);count++;}}}printf("共有 %d 种可能的组合。\n", count);return 0;
}

代码解释

  1. 定义了一个count变量,用于统计有效组合的数量。

  2. 外层循环变量big从0开始,到100 / 3结束,因为每匹大马的重量是3单位,所以最多有33匹大马(100 / 3向上取整)。

  3. 内层循环变量medium从0开始,到100 / 2结束,因为每匹中马的重量是2单位,所以最多有50匹中马。

  4. 计算small的值,它是100减去bigmedium的总和。

  5. 使用一个if语句检查3 * big + 2 * medium + small是否等于100。如果等于,说明找到了一个有效的组合,并打印出来。

  6. 每次找到有效组合时,count变量增加1。

  7. 循环结束后,打印出所有有效组合的总数。

相关文章:

力扣喜刷刷--day1

1.无重复字符的最长子串 知识点&#xff1a;滑动窗口 基本概念 窗口&#xff1a;窗口是一个连续的子序列&#xff0c;可以是固定长度或可变长度。滑动&#xff1a;窗口在数据序列上移动&#xff0c;可以是向左或向右。边界&#xff1a;窗口的起始和结束位置。 应用场景 字符…...

配置linux的yum镜像为阿里镜像源

1.备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base.repo 到/etc/yum.repos.d wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 3.清空并生成缓存 yum clean …...

react使用markdown进行展示

有一些文档非常长&#xff0c;但是又要挨个设置样式&#xff0c;直接用 组件库 - marked 注意文档要放在public下才能读取。但非常方便 import { marked, Renderer } from "marked".....const [html, setHtml] useState<any>("")const renderer:…...

实时温湿度监测系统:Micropython编码ESP32与DHT22模块的无线数据传输与PC端接收项目

实时温湿度监测系统 前言项目目的项目材料项目步骤模拟ESP32接线连接测试搭建PC端ESP32拷录环境对ESP32进行拷录PC端搭建桌面组件本地数据接收桌面小组件部分 实验总结 前言 人生苦短&#xff0c;我用Python。 由于我在日常工作中经常使用Python&#xff0c;因此在进行该项目…...

CloudWatch Logs Insights 详解

CloudWatch Logs Insights 是 AWS 提供的强大日志分析工具,允许您快速、交互式地搜索和分析日志数据。本文将详细介绍使用 CloudWatch Logs Insights 所需的权限、常用查询方法,以及一些实用的查询示例。 1. 所需权限 要使用 CloudWatch Logs Insights,用户需要具备以下 I…...

Jmeter在信息头中设置Bearer与 token 的拼接值

思路&#xff1a;先获取token&#xff0c;将token设置成全局变量&#xff0c;再与Bearer拼接。 第一步&#xff1a;使用提取器将token值提取出来&#xff0c;使用setProperty函数将提取的token值设置成全局变量&#xff0c;在登录请求后面添加BeanShell取样器 或者 BeanShell后…...

C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案

目录 一、代码解析&#xff1a; 二、解决方案 1、增加日志记录 2、异步操作 注意事项 3、增加超时机制 4、使用线程池 5、使用信号量或事件 6、监控数据库连接状态 在C#程序操作Sql Server数据库的实际应用中&#xff0c;若异常就会抛出异常&#xff0c;我们还能找到异…...

数据统计与数据分组18-25题(30 天 Pandas 挑战)

数据统计与数据分组 1. 知识点1.18 分箱与统计个数1.19 分组与求和统计1.20 分组获取最小值1.21 分组获取值个数1.22 分组与条件查询1.23 分组与条件查询及获取最大值1.24 分组及自定义函数1.25 分组lambda函数统计 2. 题目2.18 按分类统计薪水&#xff08;数据统计&#xff09…...

Apache Seata应用侧启动过程剖析——注册中心与配置中心模块

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata应用侧启动过程剖析——注册中心与配置中心模块 前言 在Seata的应用侧&#xf…...

大话光学原理:1.“实体泛光说”、反射与折射

一、实体泛光说 在古希腊&#xff0c;那些喜好沉思的智者们中&#xff0c;曾流传着一个奇妙的设想&#xff1a;他们认为&#xff0c;我们的眼睛仿佛伸出无数触手般的光线&#xff0c;这些光线能向四面八方延伸&#xff0c;紧紧抓住周围的每一个物体。于是&#xff0c;当我们凝视…...

住宅代理、移动代理和数据中心代理之间的区别

如果您是一名认真的互联网用户&#xff0c;可能需要反复访问某个网站或服务器&#xff0c;可能是为了数据抓取、价格比较、SEO 监控等用例&#xff0c;而不会被 IP 列入黑名单或被 CAPTCHA 阻止。 代理的工作原理是将所有传出数据发送到代理服务器&#xff0c;然后代理服务器将…...

光学传感器图像处理流程(一)

光学传感器图像处理流程&#xff08;一&#xff09; 1. 处理流程总览2. 详细处理流程2.1. 图像预处理2.1.1. 降噪处理2.1.2. 薄云处理2.1.3. 阴影处理 2.2. 辐射校正2.2.1. 辐射定标2.2.2. 大气校正2.2.3. 地形校正 2.3. 几何校正2.3.1. 图像配准2.3.2. 几何粗校正2.3.3. 几何精…...

el-table 树状表格查询符合条件的数据

需要对el-table的树状表格根据输入机构名称&#xff0c;筛选出符合条件的数据&#xff0c;可用如下方法&#xff1a; 页面内容如下&#xff1a; <el-input v-model"ogeName" placeholder"请输入机构名称"><el-table :data"list" row…...

MQTT教程--服务器使用EMQX和客户端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、基于发布-订阅模式的消息传输协议&#xff0c;适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎&#xff0c;能够实现传感器、执行器和其它设备…...

326. 3 的幂

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 一、题目二、答案三、总结 一、题目 …...

多标签问题

一、多标签问题与单标签问题的区别&#xff1a; 多标签问题是单标签问题的推广。 举个例子&#xff0c;同时识别图片中的小汽车&#xff0c;公交车&#xff0c;行人时&#xff0c;标签值有三个&#xff1a;小汽车&#xff0c;公交车&#xff0c;行人。 单标签问题仅对一个标签…...

suricata7 rule加载(三)加载options

suricata7.0.5 加载options (msg:“HTTP Request Example”; flow:established,to_server; http.method; content:“POST”; http.uri; content:“query.php”; bsize:>9; http.protocol; content:“HTTP/1.1”; bsize:8; http.host; content:“360”; bsize:>3; class…...

【电路笔记】-C类放大器

C类放大器 文章目录 C类放大器1、概述2、C类放大介绍3、C类放大器的功能4、C 类放大器的效率5、C类放大器的应用:倍频器6、总结1、概述 尽管存在差异,但我们在之前有关 A 类、B 类和 AB 类放大器的文章中已经看到,这三类放大器是线性或部分线性的,因为它们在放大过程中再现…...

c++语法之函数重载

引例 我们在C语言里面写add函数的时候&#xff0c;只能支持一种类型的相加&#xff0c;除非我们创建多个add函数&#xff1a; 但是这样写并不方便&#xff0c;于是就有了c的函数重载。 函数重载 函数重载就是可以将多个参数类型、顺序、数量不同&#xff0c;实现逻辑相同的函…...

EtherCAT主站IGH-- 11 -- IGH之fmmu_config.h/c文件解析

EtherCAT主站IGH-- 11 -- IGH之fmmu_config.h/c文件解析 0 预览一 该文件功能`fmmu_config.c` 文件功能函数预览二 函数功能介绍1. `ec_fmmu_config_init`2. `ec_fmmu_set_domain_offset_size`3. `ec_fmmu_config_page`示例用法示例详细说明三 h文件翻译四 c文件翻译该文档修改…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...