每日练习——leetcode77和347

目录

347. 前 K 个高频元素

题目描述

解题思路

代码实现

77. 组合

题目描述

解题思路

代码实现

347. 前 K 个高频元素

题目描述

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

解题思路

  1. 排序:首先,对输入的整数数组 nums 进行排序,这样可以方便后续对相同数字进行计数。

  2. 计数:使用结构体数组 Nums 来存储排序后的数字以及它们的出现次数。遍历排序后的 nums,对于每个数字,如果与前一个数字相同,则增加计数;如果不同,则创建一个新的 Num 结构体,并设置计数为 1。

  3. 再次排序:根据 Num 结构体的 cnt 字段(即数字的出现次数)对 Nums 进行降序排序。这样,出现次数最多的数字会排在前面。

  4. 提取结果:从排序后的 Nums 中提取前 k 个数字,即出现次数最多的 k 个数,存入结果数组 res

  5. 返回结果:返回结果数组 res,并设置 returnSize 为 k

代码实现

/**  * Note: The returned array must be malloced, assume caller calls free().  */  
struct Num {  int num;     // 存储数字  int cnt;     // 存储数字出现的次数  
};  // 比较函数,用于整数数组的排序  
int cmp(const void* a, const void* b) {   return *(int*)a - *(int*)b;  
}  // 比较函数,用于Num结构体的排序,按出现次数降序  
int cmps(const void* a, const void* b) {  return (*(struct Num*)b).cnt - (*(struct Num*)a).cnt;  
}  int* topKFrequent(int* nums, int numsSize, int k, int* returnSize) {  *returnSize = k;  int* res = (int*)malloc(sizeof(int) * k); // 分配结果数组内存  struct Num Nums[numsSize];                 // 定义结构体数组用于存储数字及其出现次数  int index = 0;                             // 结构体数组的索引  // 对整数数组进行排序  qsort(nums, numsSize, sizeof(int), cmp);  // 初始化第一个Num结构体  Nums[index].num = nums[0];  Nums[index].cnt = 1;  // 遍历整数数组,进行计数  for (int i = 1; i < numsSize; i++) {  if (nums[i] == nums[i - 1]) {  Nums[index].cnt++;  } else {  index++;  Nums[index].num = nums[i];  Nums[index].cnt = 1;  }  }  // 根据出现次数对Nums进行降序排序  qsort(Nums, index + 1, sizeof(struct Num), cmps);  // 提取前k个数字  for (int i = 0; i < k; i++) {  res[i] = Nums[i].num;  }  return res;  
}



77. 组合

题目描述

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],
]

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n

解题思路

一、问题分析

题目要求从n个数字中选出k个数字的所有组合。这是一个典型的组合问题,其中组合是不考虑顺序的。我们需要生成所有可能的组合,并返回这些组合的结果。

二、回溯算法介绍

为了解决这个问题,可以使用回溯算法。回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃该解,即“回溯”并尝试其他的可能性。

三、定义全局变量

在回溯的过程中,需要一些全局变量来辅助计算。path 数组用于存储当前正在构建的组合路径,result 数组用于存储所有找到的组合结果,pIndex 和 rIndex 分别用于追踪 path 和 result 的索引。

四、编写回溯函数

  1. 递归终止条件:当 pIndex(当前路径的长度)等于 k 时,说明已经找到了一个完整的组合,将其添加到 result 数组中。

  2. 搜索空间剪枝:我们从 startIndex 开始遍历,确保不会重复选择数字,也不会选择超过剩余需要的数字数。这里 startIndex 的取值范围是根据当前路径长度和剩余需要选择的数字数来确定的。

  3. 递归与回溯:对于每个遍历到的数字,将其添加到 path 中,并递归调用 backtracking 函数继续搜索下一个数字。递归返回后,需要撤销选择,即将 pIndex 减一,以尝试其他可能性。

五、编写主函数

  1. 初始化:为 path 和 result 分配内存,并初始化 pIndex 和 rIndex

  2. 调用回溯函数:调用 backtracking 函数开始生成组合。

  3. 设置返回信息:设置返回的组合数量和大小信息。由于每个组合的大小都是 k,可以直接用一个数组 returnColumnSizes 来存储每个组合的大小信息。

  4. 返回结果:返回 result 数组作为结果。

代码实现

/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume* caller calls free().*/// 定义全局变量,用于存储当前路径和结果
int* path;          // 存储当前正在构建的组合路径
int** result;       // 存储所有组合的结果
int pIndex, rIndex; // 分别用于追踪 path 和 result 的索引// 回溯函数,用于生成所有可能的组合
void backtracking(int n, int k, int startIndex) {// 如果当前路径中的数字个数达到了 k,说明找到了一组解if (pIndex == k) {// 分配内存存储当前路径int* tmp = (int*)malloc(k * sizeof(int));// 将当前路径复制到 tmp 中for (int i = 0; i < k; i++) {tmp[i] = path[i];}// 将 tmp 添加到结果数组中result[rIndex++] = tmp;return;}// 从 startIndex 开始遍历到最大可能的起始位置for (int i = startIndex; i <= n - (k - pIndex) + 1; i++) {// 将当前数字添加到路径中path[pIndex++] = i;// 继续递归搜索下一个数字backtracking(n, k, i + 1);// 回溯,撤销选择pIndex--;}
}int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {path = (int*)malloc(k * sizeof(int));result = (int**)malloc(200001 * sizeof(int*));// 初始化索引pIndex = 0, rIndex = 0;// 调用回溯函数开始生成组合backtracking(n, k, 1);// 设置返回的组合数量和大小信息*returnSize = rIndex;*returnColumnSizes = (int*)malloc(rIndex * sizeof(int));// 设置每个组合的大小为 kfor (int i = 0; i < rIndex; i++) {(*returnColumnSizes)[i] = k;}// 返回结果return result;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API接口京东开放平台item_get-获得京东商品详情API接口根据商品ID查询商品标题价格描述等详情数据

京东商品详情API接口可以提供以下方面的信息&#xff1a; 商品基础信息&#xff1a;包括商品的标题、价格、描述、图片等基本信息&#xff0c;这是构建电商平台的基础数据。商品分类信息&#xff1a;帮助用户更好地了解商品所属的类别&#xff0c;便于商品筛选和查找。商品销售…

sheng的学习笔记-AI-决策树(Decision Tree)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 什么是决策树 划分选择 信息增益 增益率 基尼指数 剪枝处理 预剪枝 后剪枝 连续值处理 另一个例子 基本步骤 排序 计算候选划分点集合 评估分割点 每个分割点都进行评估&#xff0c;找到最大信息增益的…

DB schema表中使用全局变量及在DB组件中查询

DB schema表中使用全局变量及在DB组件中查询 规则如下&#xff1a; 使用如下&#xff1a; 如果在unicloud-db组件上不加判断条件&#xff0c;就会报错&#xff0c;并进入到登录页。 那么就会进入到登录页&#xff0c;加上了判断条件&#xff0c;有数据了就不会了。 因为在sc…

Kotlin学习ing

函数名称应采用驼峰式大小写形式&#xff0c;并且应该是动词或动词短语。val 和 var字符串模板&#xff1a;fun main() {val numberOfPhotos 100val photosDeleted 10println("$numberOfPhotos photos")println("$photosDeleted photos deleted")println…

电脑录屏软件哪个好用又免费?市面20款录屏软件测评结果

随着在线教学、远程办公和自媒体创作的兴起&#xff0c;电脑录屏软件逐渐成为了许多用户的必备工具。市面上的录屏软件琳琅满目&#xff0c;但真正既好用又免费的却并不多见。为了帮助大家找到心仪的录屏软件&#xff0c;我们对市面上20款热门免费录屏软件进行了详细的测评。 电…

一起学习python——基础篇(20)

前言&#xff0c;之前经常从网上找一些免费的接口来测试&#xff0c;有点受制于人的感觉。想了想还不如直接写一个接口&#xff0c;这样方便自己测试。自己想返回什么格式就返回什么样子&#xff0c;不用担心服务报错&#xff0c;因为自己就可以完全掌控。然后宿舍二哥告诉我py…

Android笔记--MediaCodec(二)

这一节主要了解MediaCodec处理音频&#xff0c;MediaCodec直译媒体解码器&#xff0c;用于访问媒体编解码器&#xff0c;即编码器/解码器组件&#xff0c;它是 Android 多媒体支持基础设施的一部分&#xff1b;从广义上讲&#xff0c;编解码器处理输入数据以生成输出数据。它异…

OpenHarmony C/C++三方库移植适配

简介 众所周知&#xff0c;C/C三方库相对与JS/ETS的三方组件来说&#xff0c;其运行效率高。那如何将一个C/C三方库移植到OH系统上呢&#xff1f;本文将介绍如何快速高效的移植一个C/C三方库到OpenHarmony上。 C/C三方库适配问题与解决方案 由上图可以看出&#xff0c;三方库…

回溯算法初识

文章目录 回溯算法初识什么是回溯算法回溯算法的步骤回溯算模版例题 回溯算法初识 什么是回溯算法 ​ 回溯算法是一种通过不断尝试可能的解决方案来解决问题的算法。它通常用于解决组合优化问题&#xff0c;如排列组合问题、子集和问题等。该算法通过尝试所有可能的候选解&am…

【Redis】事务

Redis事务是一组命令的集合。这组命令顺序化执行而不会被其他命令插入。 Redis事务命令 命令描述DISCARD取消事务&#xff0c;放弃执行EXEC执行事务MULTI标记事务的开始UNWATCH取消WATCH对所有key的监控WATCH监控所有key Redis事务特点 特点说明单独的隔离操作Redis命令执行…

方法引用(详)

一.方法引用 1.概念&#xff1a;把已经有的方法拿过来用&#xff0c;当作函数式接口中抽象方法的方法体 2.使用方法引用之前需要满足的规则 &#xff08;1&#xff09;.引用处必须是函数式接口 &#xff08;2&#xff09;.被引用的方法必须已经存在&#xff08;如果不存在就…

时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解

时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解 目录 时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解&#xff08;完整源码和数据) 1.利用鲸…

MySQL 全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 操作符含义必须有-必须不包含>包含对应…

建模设计软件 Archicad 27 for mac激活版

在建筑设计领域&#xff0c;每一次技术的革新都意味着设计效率和质量的飞跃。Archicad 27 for Mac&#xff0c;就是这样一款引领行业变革的设计软件。 Archicad 27凭借出色的性能优化和强大的功能更新&#xff0c;为Mac用户带来了前所未有的建筑设计体验。它支持BIM&#xff08…

洛谷P1263题解

题目描述 从前有一个王国&#xff0c;这个王国的城堡是 m 行 n 列的一个矩形&#xff0c;被分为 mn 个方格。一些方格是墙&#xff0c;而另一些是空地。这个王国的国王在城堡里设了一些陷阱&#xff0c;每个陷阱占据一块空地。 一天&#xff0c;国王决定在城堡里布置守卫&…

leetcode热题HOT 22. 括号生成(回溯)

一、问题描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&a…

Docker搭建FFmpeg

FFmpeg 是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的完整解决方案。FFmpeg 包含了领先的音视频编解码库libavcodec&#xff0c;可以用于各种视频格式的转换。 应用场景包括&#xff1a; 视频转换&#xff1a;把视频从一种格式转换成另一种格式。视…

线程池的七大参数如何确定?

目录 一、前言 二、ThreadPoolExecutor的重要参数 1、corePoolSize: 核心线程数 2、maximumPoolSize&#xff1a;最大线程数 3、keepAliveTime&#xff1a;线程空闲时间 4、queueCapacity&#xff1a;任务队列容量&#xff08;阻塞队列&#xff09; 5、allowCoreThreadTi…

【日常记录】【JS】styled-components库的原理,模板字符串调用函数

文章目录 1、引言2、模板字符串调用函数3、实现 1、引言 在react 中&#xff0c;styled-components 是最流行的 css in js 模式的库 2、模板字符串调用函数 let stu {name: 呆呆狗,age: 30,address: 中国}let str fn你好${stu.name}今年${stu.age}岁,来自${stu.address}这样会…

3D室内装潢设计 Sweet Home 3D for Mac 中文直装版

Sweet Home 3D 是一款非常棒的家装辅助设计软件&#xff0c;支持包括中文在内的16中语言&#xff0c;它能帮您通过二维的家居平面图来设计和布置您的家具,还可以用三维的视角浏览整个装修布局的全貌。是一款操作起来简单方便&#xff0c;使用起来快捷、迅速&#xff0c;拥有超高…