力扣喜刷刷--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. 循环结束后,打印出所有有效组合的总数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3223964.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python的51job招聘数据采集与可视化项目实践

项目背景与目标 在当今竞争激烈的就业市场中&#xff0c;深入分析招聘信息对于求职者和企业都具有重要意义。基于Python的51job招聘数据采集与可视化项目旨在通过自动化手段高效获取大量招聘信息&#xff0c;并对这些数据进行深度分析和展示。 51job作为中国领先的招聘网站&…

干货:高水平论文写作思路与方法

前言:Hello大家好,我是小哥谈。高水平论文的写作需要扎实的研究基础和严谨的思维方式。同时,良好的写作技巧和时间管理也是成功的关键。本篇文章转载自行业领域专家所写的一篇文章,希望大家阅读后可以能够有所收获。🌈 目录 🚀1.依托事实/证据,通过合理的逻辑,…

【深度学习基础】环境搭建 linux系统下安装pytorch

目录 一、anaconda 安装二、创建pytorch1. 创建pytorch环境&#xff1a;2. 激活环境3. 下载安装pytorch包4. 检查是否安装成功 一、anaconda 安装 具体的安装说明可以参考我的另外一篇文章【环境搭建】Linux报错bash: conda: command not found… 二、创建pytorch 1. 创建py…

C++ 是否变得比 C 更流行了?

每年都会出现一种新的编程语言。创造一种新语言来解决计算机科学中的挑战的诱惑很难抗拒。一些资料表明&#xff0c;目前有多达 2,500 种语言&#xff0c;这并不奇怪&#xff01; 对于我们嵌入式软件开发人员来说&#xff0c;这个列表并不长。事实上&#xff0c;我们可以用一只…

【Java算法】二分查找 下

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 一.山脉数组的峰顶索引 题目链接&#xff1a;852.山脉数组的峰顶 ​ 算法原理 这段代码实现了一个查找山峰数组中峰值索引的算法。山峰数组是一个先递增后递减的数组&…

解决安卓tv 蓝牙遥控器配对后输入法弹不出来的问题

t972在蓝牙配对后,自带的LatinIME 输入法会出现弹不出来的现象。 经过分析,主要为蓝牙的kl 文件适配存在问题。解决如下: 1.新建 kl文件Vendor_2b54_Product_1600.kl 放到 /vendor/usr/keylayout/下 内容: #for bl remote add by jason 20240709 key 113 VOLUME_MUTE …

来一场栈的大模拟(主要是单调栈)

一.栈模拟 二.单调栈求最大矩形面积 通常&#xff0c;直方图用于表示离散分布&#xff0c;例如&#xff0c;文本中字符的频率。 现在&#xff0c;请你计算在公共基线处对齐的直方图中最大矩形的面积。 图例右图显示了所描绘直方图的最大对齐矩形。 输入格式 输入包含几个测…

Java内存区域与内存溢出异常(补充)

2.2.5 方法区 方法区(Method Area)与Java堆一样&#xff0c;是各个线程共享的内存区域&#xff0c;它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分&#xff0c;但是它却有一…

【C++】开源:坐标转换和大地测量GeographicLib库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍坐标转换和大地测量GeographicLib库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关…

“郑商企航”暑期社会实践赴美丽美艳直播基地开展调研

马常旭文化传媒网讯&#xff08;记者张明辉报道&#xff09;导读&#xff1a;2024 年 7 月 3 日&#xff0c;商学院暑期社会实践团“郑商企航”在河南省郑州市新密市岳村镇美丽美艳直播基地&#xff0c;展开了一场意义非凡的考察活动&#xff0c;团队成员深度调研了直播基地的产…

关于string的‘\0‘与string,vector构造特点加部分特别知识点的讨论

目录 前言&#xff1a; 问题一&#xff1a;关于string的\0问题讨论 问题二&#xff1a;C标准库中的string内存是分配在堆上面吗&#xff1f; 问题三&#xff1a;string与vector的capacity大小设计的特点 问题四&#xff1a;string的流提取问题 问题五&#xff1a;迭代器失…

c++内存管理(上)

目录 引入 分析 说明 C语言中动态内存管理方式 C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 引入 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() { static int staticVar 1; int localVar 1…

MySQL:TABLE_SCHEMA及其应用

MySQL TABLE_SCHEMA及其应用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

(2)滑动窗口算法练习:无重复字符的最长子串

无重复字符的最长子串 题目链接&#xff1a;3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"a…

二战架构师,拿下

前言 已经许久更新文章了&#xff0c;并不是因为我懒了&#xff0c;而是在备考系统架构师考试。个人感觉还是比较幸运的&#xff0c;低分飘过。现阶段任务也算完成了&#xff0c;记录一下感受。 什么是软考 软考&#xff0c;全称“计算机技术与软件专业技术资格&#xff08…

快速入门,springboot知识点汇总

学习 springboot 应该像学习一门编程语言一样&#xff0c;首先要熟练掌握常用的知识&#xff0c;而对于不常用的内容可以简单了解一下。先对整个框架和语言有一个大致的轮廓&#xff0c;然后再逐步补充细节。 前序: Spring Boot 通过简化配置和提供开箱即用的特性&#xff0c…

解决了一个java Bug:Exception in thread “main“ java.lang.NullPointerException

写代码&#xff0c;遇到了个问题。 很纳闷&#xff0c;跟着人家写的代码。只能去查资料。 赶紧去找&#xff0c;自己的代码 逆天&#xff0c;赶紧改&#xff01; 成功了&#xff01;&#xff01;&#xff01;

Msfvenom制作自己的专属Shell

Msfvenom制作自己的专属Shell 如何通过Msfvenom来生成用户自己的专属Shell?有时候我们上传Shell到目标主机后&#xff0c;不仅我们自己可以连接&#xff0c;其他用户也可以连接&#xff0c;有时候会导致我们丢失该Shell&#xff0c;甚至该shell被用户发现并查杀。 实验环境 …

昇思MindSpore25天学习Day19:CycleGAN图像风格迁移互换

(TOC)[CycleGAN图像风格迁移呼唤] 模型介绍 模型简介 CycleGAN(Cycle Generative Adversaial Network)即循环对抗生成网络&#xff0c;来自论文Link:Unpaired lmage-to-mage Translation using Cycle-Consistent AdvesairalNetworks该模型实现了—种在没有配对示例的情况下学…

ByteMD富文本编辑器的vue3配置

Git地址&#xff1a;GitHub - bytedance/bytemd: ByteMD v1 repository 控制面板输入 npm install bytemd/vue-next 下载成功后在src/main.ts中引用 import "bytemd/dist/index.css";引入后保存&#xff0c;下面是一些插件&#xff0c;比如说我用到gmf和hightLight&…