- 博客(89)
- 问答 (3)
- 收藏
- 关注
原创 qml中信号相应相关
关于子控件发布的一个信号在子控件内部以及在父控件中都存在响应时,会两者都进行响应,且子控件先行响应,而后父控件响应。可见 在子控件内部以及父控件内部都有。由此可看出其响应的顺序。
2023-03-04 20:35:33
150
原创 Qt for android设置启动页
毕设过程中想给软件加个启动页面,方法来源戳这里简述一下,主要就是修改AndroidManifest.xml文件(该文件在项目第一次编译时会自动生成,然后就可以将它添加到资源目录下了)如图打开这俩行注释,并添加目标图片至对应文件夹注意这一部分:1.一定要添加正确路径(/res/drawable),并写正确文件名(不需要带后缀名哦如.jpg或.png),否则编译会报错2.drawable也可以不用新建,由于我修改过应用图标,因此存在drawable-hdpi、drawable-ldpi、drawab
2022-05-14 01:04:32
493
1
原创 OSG运行程序时按键不响应
第一次运行OSG案例,按下esc后整个画面定住不动,查找资料后找到原因和解决办法,记录一下 戳这里原文地址原因:OSG运行程序时是全屏,使得输入法无法切换到英文模式解决方法:方法一.添加美式键盘在设置-选择语言里面,添加语言选择美式English,在运行程序前切换到该键盘方法二.运行程序之后,按下键盘前,先按住鼠标左键这样程序能够响应按键事件了...
2022-05-12 13:45:24
620
原创 使用windeployqt打包QML项目
打包Qt中可执行项目一般直接使用QT自带的windeployqt.exe工具,但本次打包时突然出现了双击后程序闪退的现象,后来查找资料才发现是使用打包时候的命令不对,通过这篇文章解决了问题点击这里这里抄录一遍,防止忘记windeployqt.exe --qmldir qmlPath xx.exeqmlPath:qmlPath 指的是你的项目中 qml 文件所在的文件路径!!!...
2022-05-05 00:58:18
940
原创 QT中UDP套接字的使用
实现:两个对话框之间利用udp套接字进行通信。UdpSocket:面向无连接步骤:1.设置好自身端口号,发送方的端口号和IP2.通过套接字绑定端口号bind3. 书写报文writeDatagram(报文内容,对方IP地址,对方端口号)4. 监听信号ReadyRead,读取报文readDatagram界面布局(利用UI设计):各控件类型即名字代码:widget.cpp#ifndef WIDGET_H#define WIDGET_H#include <QWidget>
2021-07-10 16:32:42
969
2
原创 486和887.博弈问题
486预测赢家问题和887石子游戏其实是一模一样的两题,这里放在一起总结思路:利用动态规划,dp[i][j]表示的是,在下标i到j范围内,双方取最优方案下先手能够与后手拉开的最大距离。这里最关键我认为是dp[i][j]的实际理解,其实这里的dp值的涵义是在随情况变化的,如[1,5,2]这个例子,dp[0][1]=5,dp[1][2]是3,此时这两个值表示的就是先手能拉开的最大距离,之后讨论dp[0][2]了,根据递推式:dp[i][j]=max(num[i]-dp[i+1][j],num[j]-dp[i]
2021-06-16 13:33:43
78
原创 QT 登录窗口
1.UI界面的布置各个空间的名字和所属的类注意,这里密码框处要使得输入的字符为实心圆或者不显示,需要更改该控件下的一个属性:2。具体功能的实现loginwindow.h#ifndef LOGINWINDOW_H#define LOGINWINDOW_H#include <QString>#include <QMainWindow>#include <QDebug>#include <QLineEdit>#include <QM
2021-06-15 22:02:01
330
原创 leetcode之363和1074和1314
363.矩形区域不超过K的最大数值之和 1074.元素和为目标值的子矩阵数量这两题放在一起是因为解题过程几乎一模一样:都是采用前缀和,先固定上下边界,求每一列之和,再求利用前缀和来求解。1074:class Solution {public: int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) { int result(0); //上边界
2021-05-29 14:53:46
149
原创 1707.与数组中元素的最大异或值
这道题我最终还是没能完全做出来,不过无妨,菜鸡的我向来对这种困难题都是抱着随意的心理。主要是学习里面的知识点:字典树字典树就是相当于每一个节点都是一个同类型的指针数组,输入一段数字(或字符),如果当前字符后有字符,若不存在就继续加入,再指向下一个节点,一直延续直到整个串结束(插入过程),其实比较好理解。这一题主要就是利用了字典树的特征,按照位来分析,并且是从高位到底位,先判断与当前位相异的节点是否存在,若存在刚刚好指向此节点,不存在的话只能指向同节点。从高位考虑就能够找到最大的异或结果。这过程还有好多细
2021-05-23 16:10:28
90
原创 810.黑板异或游戏
思路:这里参考解题区“宫水三叶”小姐姐的解题。这种“博弈论”的题没做过,再加上是困难题,直奔解题区。这一题首先要明白如何才能让A取胜:即在A擦去一个数字之前,黑板上的数异或和已经是0了,于是这里就先出现了一种A获胜的情况,就是黑板上所有数字的异或开始就为0(A是先擦数字)。若一开始异或不为0,想要A获胜,首先A要擦去一个数字,(假设擦去一个数字后黑板上剩余数字的异或为sum),现在轮到B了,要使得B擦去一个数字后必败(选手们都是择对自己最优的解),就要使得剩下数字擦去任意一个后异或结果都为0,假设B擦
2021-05-22 13:56:58
136
原创 1049.最后一块石头的重量Ⅱ
思路:由于太菜,所以直接去看了解题,是利用01背包问题方案来求解(好吧我对这个解法不太熟悉),其实这一题主要就是求两个数的最小差值。那要求最小差值怎么求呢?自然是两数越接近sum/2,它们的差值就会越小啦!下面就想象在背包里装石头了,用数组dp[i][j]表示在j重量限制下对于前i个石头来说能装的最大重量(当然是越接近限度越划算啦),对于dp[i][j]来说,有两个选择:1.扔掉stone[i],这样的话,它的最优方案就是dp[i-1][j]。2.放入stone[i],要他能取最大,就要使得对于前i-1个石
2021-05-13 20:11:40
75
原创 1269.停在原地的方案数
思路:这一题我首先想到的是用回溯,然后感觉时间复杂度太大了,遂放弃。然后想到用动规,dp[i][j]存放的是第i+1步到达下标为j点的方案数。class Solution {#define N 1000000007public: int numWays(int steps, int arrLen) { //这里一定要判断取最小的那个否则会超时 //原因:对于step步最长也只能一直前进step //再前进也出不了arrlen i
2021-05-13 17:08:16
62
原创 1310.子数组异或查询
思路:可以设置一个前缀异或数组mid,此数组第一个元素为0,往后第i个元素记录的就是arr的0~i-1元素的异或。对于区间[left,right]来说,如果left和right相等就直接返回对应的arr值,不相等的话,我们可以已知0到left前一个元素的异或结果是mid[left](没有减一是由于第一个元素为0),0到right的异或结果是mid[right+1],由a^a=0可以求得left到right的异或结果就是mid[right+1]异或上mid[left],刚好把前left个元素消去。class
2021-05-12 21:08:51
64
原创 1734.解码异或后的排序
思路:一开始没有想那么多,没有把条件n是个奇数利用起来。最开始的做法是暴力,直接循环查找+回溯,意料之中的超时,一边写一边都觉得时间复杂度太高了。class Solution { vector<int> result; map<int,int> mp; bool Find(vector<int>& encoded,int sit) { if(sit>encoded.size()) return true;
2021-05-11 16:30:19
52
原创 1482.制作m束花所需的最少天数
思路:直接对天数二分查找,对于所需要的花总数大于现有花束的情况是肯定找不到答案的,直接返回-1;接下来讨论存在答案的情况:天数的左边界为每朵花开放的最小天数,右边界为最大天数。对每一次二分出来的天数mid进行判断,如果满足条件,有边界直接等于mid,若不满足条件,说明最终天数要大于目前的二分天数,将左边界挪动到mid+1处,直至找到最终答案。class Solution { //判断是否满足需要的花束条件 bool Judy(vector<int>& bloomDay
2021-05-09 15:35:43
69
原创 1723.完成所有工作的最短时间
思路:这种题我思考了三分钟想不出好的办法,直接看官方解答,并试图看懂了一种解题,即二分查找+回溯+剪枝先考虑工作量顺序的分配,正如解答所说要先分配工作量大的工作,因为越到后面工作量越大越难分配(但其实从小到大分配也是一样能够解题的)接下来考虑二分查找,这一题的思路其实是自己选择出答案再进行判断,利用二分查找能够更快的得到最短时间,这里需要考虑二分查找的上下限,如果只有一个工人,则所有工作都由他一人完成,所以此题的右边界是工作量之和;如果工作数和工人一样多,那么最短的时间就是工作量最大的那一个,这就是左边
2021-05-08 20:31:30
228
原创 1838.最高频元素的频数
思路:一开始我是使用暴力解法,先排序,一个一个元素遍历,从该元素最近的一个数(左边)往左求它们的差值和直到超出了目标值k,再存所包含的最大元素个数,然后就超出时间限制了:class Solution {public: int maxFrequency(vector<int>& nums, int k) { sort(nums.begin(),nums.end()); int result(1); for(int i=1;i<
2021-05-07 20:31:21
167
原创 583.两个字符串删除操作
思路:第一个方法递归,显然时间复杂度很高,果然不出所料超出时间限制。class Solution { int Sum(const string& a,const string& b,int i,int j) { if(i<0||j<0) return 0; if(a[i]==b[j]) return 1+Sum(a,b,i-1,j-1); else return max(Sum(a,b,i,j-1),Sum(a,
2021-05-06 21:48:38
91
原创 686.重复叠加字符串匹配
思路:看到有关子串的匹配问题,我都会立刻想到KMP算法,这一题也不例外。有了判断是否是字串的算法后,这一题还有一个考虑的点是需要重复叠加几次。显然如果要将b作为自己的子串,其长度一定不能小于子串b的长度。母串的最大限度则是比子串b多出了一个完整的自己,若这样仍不能匹配成为子串,说明b无法成为其子串了。class Solution { vector<int> next; //求next数组 void Next(vector<int>& next,str
2021-05-06 20:04:15
96
原创 740.删除并获得点数
思路:动态规划,需要先排序,dp[i]存放的是包括i在内的最大点数和。对于nums[i]来说分情况讨论:1.nums[i-1]nums[i]时,此时dp[i]就直接是dp[i-1]加上本身2.nums[i-1]+1nums[i]时,这里对于dp[i-1]来说就需要减去nums[i-1]的值(包括前面有与它相等的一系列值,如1,1,3,4这样);同时dp[i]也可能是从前面与nums[i-1]值不同的dp[i-x]来的(如1,1,1,2,3这种情况),因此dp[i]=max(dp[i-1]-nums[i]
2021-05-05 22:28:02
52
原创 137.只出现一次的数字Ⅱ
思路:我一开始想到的是排序后,三个三个的判断,虽然能够过,但显然时间复杂度比较高,不太满意后来利用哈希进行计数,其空间复杂度O(n)不算低,不算优解。后面看了官方解题,学到一种新的解法:一次确实每个二进制位。对于每一位二进制的总和来说,它要么是3的整数倍,要么就会多出1来(即某个数只出现一次造成的),因此可以借助左移右移运算符来判断。class Solution {public: int singleNumber(vector<int>& nums) {
2021-04-30 13:33:27
55
原创 633.平方数之和
思路:1.利用sqrt函数,此方法比较容易想到,直接列举从0到sqrt(c)的值,求得另一个数(即sqrt(c-i*i)),如果所求值是整数则返回真。要注意存在溢出的状况,所以可以加一个条件:i<=sqrt(INT_MAX)即可。class Solution {public: bool judgeSquareSum(int c) { for(int i=0;i<=sqrt(INT_MAX)&&i*i<=c;++i) {
2021-04-28 12:35:02
68
原创 1011.在D天内送达包裹的能力
思路:二分法,这里是对所求的包裹重量D进行二分,初始时,D的最低重量left要取数组中最大的值,这样能保证即使一个一个运也能运走全部包裹,D的最大重量right要取数组总和,这样一次性就能运走全部包裹。然后开始二分:在left<right大前提下,取中值,来计算中值所需要的天数,如果天数超过了目标天数,说明所运的重量太小,则left变成mid+1;若天数不大于目标天数,说明所运的的重量过大或正好,则让right=mid即可,最终left会等于right,即为取得的最小满足条件的重量。class So
2021-04-26 20:35:46
71
原创 377.组合总和Ⅳ
思路:动态规划,初值即总和为0的组合设定为1,然后从1到target开始推导,一个一个遍历数组,进行讨论,要注意的是溢出情况。class Solution {public: int combinationSum4(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); vector<int> dp(target+1); //设初值
2021-04-24 12:59:54
45
原创 368.最大整除子集
思路:动态规划(看了解题才知道这么用)。主要就是填dp数组,先默认为1(即只有自己),先排序,然后从第一个遍历到自己前,当能够整除前面数时,进行判断当前dp值和被整除数dp值+1(即加上的是自己)的大小,取最大的,保留但当前最大的集合数。dp数组填满后,开始从后往前找即可。class Solution {public: vector<int> largestDivisibleSubset(vector<int>& nums) { int maxsi
2021-04-23 22:19:33
105
原创 47.全排列Ⅱ
思路:回溯+剪枝,推荐大佬的讲解:要点在于record[i-1]判断条件,反正就是当前值与前一个值相等时,若前一个值没有被用到,则当前这个值也不会被用到(重复),相当于在同一层,取相同值时总是取最左边那个值,若前一个值被用到,则当前值是需要被用的,因相当于进入的树的下一层。class Solution { vector<int> record; vector<int> vv; void Find(vector<vector<int>>
2021-04-18 21:01:11
44
原创 220.存在重复元素Ⅲ
思路:滑动窗口class Solution {public: bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) { int i=0;//作为窗口的最左界限 set<int> m;//作为滑动窗口的容器 for(int j=0;j<nums.size();++j) { //max函数是为了
2021-04-17 16:53:01
62
原创 31.下一个排列
思路:来自官方解答和评论区,从后往前找到一个比它前面值小的数,再从后往前找到比这个数大的第一个数,交换这两个数,然后从此数后一个开始到最后进行升序排列。class Solution {public: void nextPermutation(vector<int>& nums) { int i=nums.size()-2; while(i>=0&&nums[i]>=nums[i+1])//从后搜索,找到比前值小的
2021-04-16 23:40:55
39
原创 213.打家劫舍Ⅱ
思路:利用动态规划,但这一题需要注意所有房屋围成一个圈,因此要考虑最后一个房屋和第一个房屋不能同时被偷。所以分为两种情况:1.考虑第一间屋子到倒数第二间屋子;2.考虑第二间屋子到最后一间屋子。 这样,所有情况都会考虑到且不需要考虑最后一间屋子和第一间屋子一起被偷。剩余动态规划考虑:前一间屋子所能取得的钱财、再前一间屋子取得财物总和与现屋子的财物加起来取最大值即可。class Solution { int Result(vector<int>& nums,int left,in
2021-04-15 21:02:13
52
原创 17.电话号码的字母组合
思路:深搜+回溯class Solution { map<char, string> M = { {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}}; string mid; void DFS(vector<string>& v,string&a
2021-04-13 22:15:03
54
原创 179.最大数
思路:看了解答,主要就是排序,先要把int型转化为string,对于所有成员来说,若a+b(字符串拼接)>b+a,则保持ab顺序,反之,就需要换顺序。利用匿名函数实现此操作。class Solution {public: string largestNumber(vector<int>& nums) { vector<string> v; for(auto i:nums) v.push_back(to_st
2021-04-12 20:05:06
39
原创 246.丑数Ⅱ
思路:查看了官方,利用的是动态规划,三个指针来表明指向的数分别乘以2,3,5。从最小丑数1开始,分别计算三个相乘结果,取最小,则最小的那个指针前移一位。对于碰到乘积与前一个相等的情况,就直接让对应指针前移并重新计算。class Solution {public: int nthUglyNumber(int n) { vector<int> v(n); v[0]=1;//第一个丑数 int p2=0,p3=0,p5=0;//分别指向被乘数
2021-04-11 20:14:38
70
原创 16.最接近的三数之和
思路:与第15题三数之和差不多,利用双指针。class Solution {public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(),nums.end());//排序 int result=nums[0]+nums[1]+nums[2]; for(int i=0;i<nums.size()-2;++i)//固定一个数
2021-04-10 15:09:47
49
原创 153.寻找旋转排序数组中的最小值
思路:二分查找class Solution {public: int findMin(vector<int>& nums) { int left=0,right=nums.size()-1; int mid; while(left<right) { if(nums[left]<=nums[right])//表明从left到right这段递增 ret
2021-04-08 20:22:31
39
原创 15.三数之和
思路:来自解题区首先给这个向量排个序,然后先判断简单的情况,元素个数小于三直接返回空。开始进入循环,固定当前数不变,如果当前所固定的数值大于0,对于递增向量来说不可能有和为0的三个数出现,直接break如果当前数和前一个数相等,就说明与刚刚情况相同,已经考虑过了,continue如果当前数与前一个数不同,定义两个指针,一个(left)指固定数的后一个数,另一个(right)指最后一个数,开始向中间挪动这两个指针,这时会出现三种情况:1.三个数之和大于0,那么right指针需要指向更小的数,则–rig
2021-04-07 21:27:26
59
原创 80.删除有序数组中的重复项
思路:temp来记录当前的数值,n记录当前数值出现的次数,i是有效的下标,j是进行遍历的下标。记录nums[j]的出现次数,若在两次以内就直接赋给nums[i],若超出两次,则j继续往后遍历找到一个与当前数值不同的数即可class Solution {public: int removeDuplicates(vector<int>& nums) { if(nums.size()==0) return 0; int i=0,
2021-04-06 20:35:22
45
原创 1718.构建字典序最大的可行序列
主要利用回溯,如下见注释class Solution {bool Find(vector<int>& v,int sit,map<int, int>& m, int n,bool& flag){ flag = true; for (int i = 1; i <= n; ++i)//判断每一个数是否都填入 if (m[i] != 0) flag = false; //两种情况返回true:1.找到答案 2.当前坐标溢出即所有数字已经排
2021-04-05 20:56:18
206
原创 88.合并两个有序数组
思路:刚刚好前一天看了《剑指offer》,里面刚好提到了这一题,主要就是从后往前进行比较更新,easy。class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int n1=m-1,n2=n-1,p=nums1.size()-1; while(n1>-1&&n2>-1)
2021-04-05 15:25:04
56
原创 781.森林中的兔子
思路:将这一系列数排序后,统计各个数的总个数,有且只当同种数的数量小于等于自身数量加1(因为是除了自己还有多少兔子与自己颜色相同)才可能为一种颜色,若大于自身数量加1,则被拆分为两个以及上团体,数量为0时表明只有自己。class Solution {public: int numRabbits(vector<int>& answers) { if(answers.size()==0) return 0; int sum=
2021-04-04 22:28:19
51
原创 1143.最长公共子序列
思路:动态规划,填数组(转移方程来自官方)class Solution {public: int longestCommonSubsequence(string text1, string text2) { int n=max(text1.size(),text2.size()); vector<vector<int>> v(n+1,vector<int>(n+1)); for(int i=0;i<tex
2021-04-03 22:10:20
52
空空如也
vs2019中程序运行出错:未加载wntdll.pdb
2021-02-03
C++中关于重载前置自增运算符的问题
2021-01-31
TA创建的收藏夹 TA关注的收藏夹
TA关注的人