自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 LeetCode刷题笔记(10)位运算

位运算主要有:按位与&,按位或|,按位异或^,~取反,<<算术左移,>>算术右移等。常用位运算技巧1)n&(n-1)可以把n最右边的1改为0,重复该过程,就可以得到n中包含的1的个数。2)n&(-n)可以把n除最右边以外的1全部改为0。461. 汉明距离先对x和y进行按位异或运算得n,再用n&(n-1)的技巧统计其中1的个数。class Solution {public: int hammingDistance(

2022-01-24 12:01:12 440

原创 LeetCode刷题笔记(9):数学问题

204. 计数质数确定<n的质数个数方法一:埃氏筛从2开始把2、3、4、5....的对应倍数标记为非质数,剩下的就是质数。class Solution {public: int countPrimes(int n) { if(n<=2) return 0; vector<bool> prime(n,false); int cnt = n-2;//统计质数个数,-2是去掉1和n for(int i=2;i*i&

2022-01-16 12:32:12 3485

原创 LeetCode刷题笔记(8):分治法

241. 为运算表达式设计优先级方法一:分治法根据运算符,划分为左右位置,分别递归计算左右表达式所有值,再将其组合运算。class Solution {public: vector<int> diffWaysToCompute(string expression) { vector<int> ways;//保存表达式结果 int n = expression.size(); for(int i=0;i<n;i+

2022-01-13 11:33:45 3284

原创 LeetCode刷题笔记(7):动态规划练习

213. 打家劫舍 II本题是198题的变形题。把线性的一维数组变成了环形数组,这导致第0个房间和第n-1个房间不能同时抢劫。因此我们可以分成两种情况讨论:1)抢0号房间,然后对[1, n-2]进行动态规划过程;2)不抢0号房间,然后对[1, n-1]进行动态规划过程。class Solution {public: int rob(vector<int>& nums) { int n = nums.size(); int pre1=nu

2021-12-31 20:01:16 247

原创 LeetCode刷题笔记(6):动态规划

1、爬楼梯(70)本题在建立状态转移方程时,要注意到每次只能跨1级或2级台阶。这说明第 i 级台阶上一级状态只能是第i-1或第i-2级台阶。设dp[ i ]表示走到第 i 阶台阶的方法数,则dp[i] = dp[i-1] + dp[i-2]。即斐波那契数列。由于每个状态只取决于前两个状态,因此我们没必要一直保存所有过程状态,可以用滚动数组的思想,只保留当前状态的前两个状态。class Solution {public: int climbStairs(int n) { if(

2021-12-13 16:07:57 380

原创 LeetCode刷题笔记(5):搜索

1、岛屿的最大面积(695)搜索问题经典模板题,先介绍BFS思路:遍历二维数组每一个位置,如果是0跳过,如果为1,则判断其相邻4个位置是否为1(前提不能出界)。为防止重复访问,增加辅助数组标记,如果入过队则标记已访问。(当然本题可以直接把访问过的结点置为0更简单)直到所有数组被访问。class Solution {public: //辅助方向数组,用于移动访问上下左右4个方向 vector<int> directions{-1,0,1,0,-1};

2021-11-29 20:30:05 312

原创 leetcode刷题笔记(4):排序

1、数组中的第K个最大元素(215)《算法笔记》中介绍过查找第K个顺序统计量的O(n)复杂度算法:即利用快速排序的划分过程,每次可以随机确定一个第 i 大的元素,根据 i 和 k的关系在对应区间继续该过程,直到 i=k。为避免最坏情况下落入O(n^2)复杂度,使用随机选主元方法。掌握快排的划分过程非常重要!!!class Solution {public: int divide(vector<int>&nums,int l, int r){

2021-11-25 21:40:47 707

原创 LeetCode刷题笔记(3): 二分法

二分法主要是利用折半查找的思想,对区间进行查找,使O(n)复杂度的时间下降为O(log n),使用时要特别注意边界的开闭情况。1Sqrt(x)(69)不用sqrt函数确定X开方后向下取整的结果。采用二分查找,实质上是找使a*a<=x成立的最大整数a。class Solution {public: int mySqrt(int x) { int low = 0,high = x,ans=-1; //if(x==1) return x; w..

2021-11-19 12:45:18 943

原创 LeetCode刷题笔记(2):双指针

双指针是用两个指针去遍历数组,协同完成检索任务。一般是利用两个指向元素的关系,决定之后指针的移动操作,找到目标或完成任务,如当两个指针指向同一数组,并且同向移动时,可以形成滑动窗口,快慢指针等;当两个指针指向同一数组,并且反向移动时,可以对有序数组形成检索。1.两数之和 II - 输入有序数组(167)使用反向指针,检索数组。class Solution {public: vector<int> twoSum(vector<int>& n.

2021-11-14 20:24:23 1063

原创 LeetCode刷题笔记(1):贪心算法

1.划分字母区间(763)本题题目要求:把字符串分成若干片段,每个字母只在一个片段中出现。为了让每个字母只出现在一个片段内,我们必须先确定每个字母出现的首、末位置,避免将其分割。这样就得到一堆区间,接下来就是要在不切断区间的情况下,把区间分成尽可能多的组。先对区间按左端排序,之后按贪心策略:若下一区间与当前小组范围相交,则加入当前组,并更新小组的右端,若不想交,则本小组范围已经确定。具体实现思路:(1)确定字母的首次、最后一次出现位置。这里定义一个结构体数组存储,以字母对应数字进行哈希.

2021-10-24 20:17:21 158

原创 PAT甲级刷题笔记(7)

1027 火星颜色本题本质上是把3个十进制数字转化为13进制下的数字输出。由于输入范围在0-168之间,只需把十进制数字除以13和对13取余后的结果输出即可。#include<cstdio>void transferRadix(int a){ if(a/13<=9){ printf("%d",a/13); }else{ int x=a/13-10; printf("%c",'A'+x); } if(

2021-09-11 23:12:06 487

原创 数据结构练习:树与二叉树

1.带空二叉树的生成和二叉树的非递归遍历//根据带空二叉树先序序列建树#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<stdlib.h>char s[100] = "ad#ef##g##b#c##";int t=0;typedef struct BiTNode { int data; BiTNode* lchild, *rchild;};void CreateTree(BiTNod

2021-09-06 16:17:00 185 1

原创 数据结构实现3:线性栈和队列

1. 线性栈的实现栈的线性实现方式与线性表的顺序实现类似,只是在元素操作上有些区别#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <corecrt_math.h>#define TRUE 1#define FASSE 0#define OK 1#define ERROR 0#define

2021-08-29 15:25:12 203

原创 数据结构练习1:线性表

1. 在有序链表中插入新节点,使之仍然有序。关键在于确定插入结点的位置,用q和p指针分别指向插入位置的前后结点,再根据p和q是否为空的情况进行讨论:(1)p和q都为空,则是空表插入;(2)仅p为空,说明插入位置在队尾;(3)仅q为空,说明插入位置在队首;不带头结点实现如下:#define _CRT_SECURE_NO_WARNINGS#include<cstdio>#include<queue>using namespace std;const in

2021-08-28 10:54:31 186

原创 数据结构实现2:单链表

/* Linear Table On Sequence Structure */#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <malloc.h>#include <stdlib.h>/*---------page 10 on textbook ---------*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#.

2021-08-27 12:24:52 295

原创 数据结构实现1:线性表的顺序存储结构

模拟实现顺序表结构。/* Linear Table On Sequence Structure */#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <malloc.h>#include <stdlib.h>/*---------page 10 on textbook ---------*/#define TRUE 1#define FALSE 0#define OK 1#defi

2021-08-26 17:01:57 494

原创 PAT甲级刷题笔记(6)

96. 最大连续子序列和(1007)本题要求求出最大连续子序列和即对应首尾元素。利用动态规划思想,关键在于如何确定状态转移方程。考虑以A[i]为结尾的最大连续序列和数组dp[i],则dp[i]=max{A[i],dp[i-1]+A[i]},又有边界条件A[0]=dp[0],即可求解。由于还需要确定子序列范围,额外定义一个数组,保留所在连续子序列的前一结点注意:(1)全为负数情况,输出最大和0,首尾元素(2)全为负数或0的情况,输出0 0 0。#include<algorithm>

2021-08-13 23:10:04 137

原创 PAT甲级刷题笔记(5)

77. 供应链上的最高价(1090)本题要求求出供应链上的最高售价和个数。实质上统计最深的叶子结点值和个数思路:(1)先用树的静态表示存储树结构(2)从根结点开始按DFS递归遍历,寻找最深结点#include<iostream>#include<stdio.h>#include<vector>#include<math.h>using namespace std;const int maxn=100010;int n,num=0,de

2021-08-04 11:35:18 122

原创 PAT甲级刷题笔记(4)

map专题本题要求实现火星数字和地球数字间的转换,核心任务有:(1)如何读入,N给定了读入数据个数,但是每个数据有几位数,是数字还是字母不确定;——>同一用字符串读取,由于中间可能有空格,采用getling()(2)映射关系是双向的,从数字到单词和单词到数字的映射都有——>根据首字符判断输入的是地球数字还是火星文,地球数字到火星文可以用字符串数组,而从火星文到地球数字用map。从地球数字到火星文简单,只需做一个进制转化去字符串数组中查找即可。从火星文到地球数字根据是否有空格

2021-07-30 23:52:39 187

原创 PAT甲级刷题笔记(3)

49. 有理数计算本题模拟两个分数的加减成熟计算,难度不大,代码比较繁琐,按照算法笔记的套路写就行。#include<iostream>#include<cstdio>using namespace std;typedef long long LL;struct Fraction{ LL up,down;};LL gcd(LL a,LL b){ if(b==0) return a; else return gcd(b,a%b);}

2021-07-28 21:53:57 152

原创 PAT甲级刷题笔记(2)

26. 毕业生录取(1080)这题的难点在于正确地录取学生到正确学校。开始我理解错了,以为志愿没有优先级,从学校的角度出发,遍历有报名本校的学生,择优录取,但这样发现一个学生可能会先被第二志愿录取,但他实际更愿意去第一志愿,若也可以录取的话,就会出错,而且这样做要遍历m(学校个数)遍学生列表,时间复杂度很大。实际上,可以仅遍历按成绩排名的学生列表一遍。对每个学生,遍历他的志愿,只有当该学校名额已达到限值,且本学生不与该校上一个录取的名次相同时,才会落选,其它情况一定可以入选。因此我们只需要增加两个额

2021-07-21 20:53:03 196

原创 PAT甲级刷题笔记(1)

1. 计算a+b(1001)本题a,b的范围都是在正负1000000以内,数值不大,因此不必担心int溢出的问题,可以直接相加。难点在于输出,每隔三位要插入“,”。我最开始是用int保存结果,通过存储%1000后的结果输出,但这样对一些特殊情况就通过不了。比如两个1000000相加,结果为200000,要准确控制输出几个0就很不方便。因此我改用string存储结果并输出,就解决了这一问题。#include<iostream>#include<string>using

2021-07-02 15:49:08 561

原创 LeedCode刷题笔记

1 贪心算法1.1 分饼干(455)本题比较简单,贪心策略是优先满足胃口较小的孩子,这样就可以满足尽量多的孩子。思路是:先将两数组排序,同时遍历两数组即可得到最大可以满足多少个孩子。int removeDuplicates(vector<int>& g, vector<int>& s) { //先对g,s数组排序 sort(g.begin(), g.end()); sort(s.begin(), s.end

2021-06-21 17:20:54 275

原创 华中科技大学计算机机试题

7.排序描述 对输入的n个数进行排序并输出。输入描述: 输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。输出描述: 可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。 每组测试数据的结果占一行。...

2021-06-15 10:42:28 404 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除