与数组元素出现频率的题目
leetcode第347题前k个高频元素
题目描述:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
12输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]
示例 2:
12输入: nums = [1], k = 1输出: [1]
题解:
123456789101112131415161718192021222324252627282930313233343536373839404142//定义结构体,记录数字及其出现的次数struct Times{ int num; int cnt;};//用于初始数组nums的排序int cmp(const void* a,const void* b){ return *(int*)a - *(int*)b;}//用于结构体的一级排序int cmps(const void* a,const void* b){ return (*(struct Times*)b) ...
二叉树基本算法
二叉树的先序,中序,后序遍历12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#include <stdio.h>#include <stdlib.h>// 二叉树节点结构struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right;};// 先序遍历void preOrderTraversal(struct TreeNode* root) { if (root != NULL) { printf("%d ", root->data); // 访问根节点 preOrderTraversal(root->left) ...
单链表中的爹题
题目描述:给定两个可能有环也可能无环的单链表,头结点head1和head2,请实现一个函数,如果两个链表相交,请返回相交的第一个结点,如果不相交,返回null
解决代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#include <stdio.h>#include <stdbool.h>struct ListNode { int val; struct ListNode* next;};struct ListNode* detectCycle(struct ListNode* head) { if (head == NULL || head->next == NULL) { return NULL; // 链表为空或只有一个节点,不可能有环 } ...
master公式—>计算递归算法的时间复杂度
假设我们有一个递归算法,将问题规模为 n 分成 a 个子问题,每个子问题的规模是原问题的 n/b,并且递归算法的时间复杂度为T(n)。
滑动窗口
1234567891011121314151617181920212223//最长模板初始化left,right,result,bestResultwhile(右指针没有到结尾){ 窗口扩大,加入right对应元素,更新当前result while(result不满足要求){ 窗口缩小,移除left对应元素,left右移 } 更新最优结果bestResult right++;}返回bestResult;//最短模板初始化left,right,result,bestResultwhile(右指针没有到结尾){ 窗口扩大,加入right对应元素,更新当前result while(result满足要求){ 更新最优结果bestResult 窗口缩小,移除left对应元素,left右移 } right++;}返回bestResult;
C语言内置排序函数
qsort函数是C标准库中提供的用于进行排序的函数,其声明如下:
12void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
这里是各个参数的解释:
base: 待排序数组的起始地址(指向数组的指针)。
nmemb: 数组中元素的数量。
size: 每个元素的大小(以字节为单位)。
compar: 比较函数的指针,用于定义元素的顺序。比较函数的原型应该是 int compar(const void *a, const void *b),并且满足以下条件:
如果 a 应该排在 b 前面,返回负值。
如果 a 和 b 相等,返回零。
如果 a 应该排在 b 后面,返回正值。
升序排序
123456789101112131415161718192021#include <stdio.h>#include <stdlib.h>int compare(const void *a, const void *b) { r ...
对数器--验证算法的正确性
对数器是用于验证算法正确性的一种测试方法。对数器的基本思想是使用一个简单但是正确的算法(暴力算法)生成问题的答案,然后用待测试的算法也生成答案,最后比较两者的结果是否一致。如果结果不一致,就说明待测试的算法可能存在问题。
下面是一个示例,使用对数器验证选择排序的正确性:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778#include <stdio.h>#include <stdlib.h>#include <time.h>void swap(int* arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;}void selectionSort(int* arr, int length ...
异或运算
定义与相关性质异或运算(XOR)是一种二进制运算,用符号 ^ 表示。它的规则是:对应的二进制位相同则结果为0,不同则结果为1。==(相当于无进位相加)==
具体的异或运算规则如下:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
异或运算有一些重要的性质:
交换律: 对于任意两个数a和b,都有a ^ b = b ^ a。
结合律: 对于任意三个数a、b、c,都有a ^ (b ^ c) = (a ^ b) ^ c。
自反性: 任何数与自己异或的结果为0,即a ^ a = 0。
零元素: 任何数与0异或的结果为它本身,即a ^ 0 = a。
异或运算常常用于一些算法和编程中,有一些应用场景如下:
交换两个数的值: a = a ^ b; b = a ^ b; a = a ^ b; 这样就可以交换a和b的值。
清零特定位: 将一个数的特定位清零,可以使用 a = a ^ (1 << ...
数组排序
冒泡排序12345678910111213141516171819202122232425262728293031323334#include <stdio.h>void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 直接交换元素的值 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }}int main() { int arr[] = {64, 34, 25, ...
二分查找法(C语言版本)
二分查找法力扣题目:704.二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
123输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4
示例 2:
123输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1
思路这道题目的前提是==数组为有序数组==,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。
大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规 ...
