Leetcode: 859.亲密字符串
859. 亲密字符串
解题思路: 这题主要是考察对题目的理解,跳脱出对s交换得到所有情况判断的思路。
分为两种情况:
s==goal且存在某个i!=j使得s[i]==s[j]
存在某个i!=j使得s[i]==goal[j]且s[j]==goal[i],并且s与goal的其他字符都相等(前提s[i]!=s[j],区别于第一种情况)
以下为C++代码:
123456789101112131415161718192021222324252627282930313233343536class Solution {public: bool buddyStrings(string s, string goal) { //分为两种情况: //第一种:s==goal且存在某个i!=j使得s[i]==s[j] //第二种:存在某个i!=j使得s[i]==goal[j]且s[j]==goal[i] if(s==goal){ int count[26]={0}; ...
基于ET的UI框架--EGUI项目导入与代码理解
前言 拿到ET框架后发现原生的UI框架非常简陋,所以萌生了基于ET去设计UI框架的想法,后续也确实实现了UI的sortingOrder分级、UICamera管理以及生命生命周期的新增、UI栈引入等等([ET6.0框架初步()]),但是近期在查看ET大佬所写框架时发现自己还是小巫见大巫了,因此还是想先去将比较成熟的EGUI导入项目中使用并且记录下方法、思路,同时对EGUI框架加上一些自己的理解。
同时也放上框架作者字母哥的B站视频链接:
1【ET框架】01-EUI介绍与UI控件获取--字母哥Binaray:https://www.bilibili.com/video/BV12F411e7bP?spm_id_from=333.999.0.0
项目导入项目框架主要区分为五个部分:
ModelView/GameLogic中对于UI表现层数据的存储,抛弃了传统ET自带Demo中传统UIName+Component的思路,将其进一步细化为UIName+ViewComponent中UIBehaviour的两部分以及UIItemBehaviour,同时将ViewCompone ...
基于ET框架的FSM状态机设计
前言 FSM状态机可以说是RPG、ACT等类型游戏的必备架构,而因为ET框架中并不带有基于ECS组件式思想所设计的状态机,因此萌生了自己设计的想法。而在参考了花花的GameFramwork解析:有限状态机(FSM)后想根据GF的思路来进行设计。 但在设计的过程中也踩了不少坑,首先GF的状态机采取了传统OOP思路,由FSM(状态机管理器,其继承自FsmBase并实现IFSM接口)管理其中的所有FSMState(状态部分),在其生命周期中调用状态中对应的函数(OnEnter、OnUpdate、OnLeave等)。因此在根据GF第一次设计出FSMComponent组件时发现还是离不开OOP的思想,甚至变成了OOP+ECS这种奇怪的组合,ET中Component存储数据与System做逻辑。
后续考虑后根据ECS的思想采用了和ET中UIEvent分发较为相似的思路。采用Attribute标记状态生命周期函数(OnInit、OnEnter、OnUpdate等)+全局FsmMgrComponent进行事件派发的方法。
基础结构:
FsmComponent中存储当前状态机名 ...
Leetcode. 375.猜数字大小 II
375. 猜数字大小 II
解题思路: 动态规划的题目,太久没做类似的了没找到合适的思路,后面查看题解后发现能以dp[i][j]表示猜由i到j数的最小现金数。(可以将题目类比为背包,最小金额–最大价值,货物种类&&背包容量–猜数范围)
递推式子在每次确定范围后为max(dp[k+1][j],dp[i][k-1]),因为要保证确保获胜,所以要取max。
当dp[i][i]时,不用支付现金,因此dp[i][i]=0
外层i确定每次遍历左边界,外层j确定每次遍历右边界,因为初始化时已经让dp中所有元素都为0,所以外层遍历直接保证i!=j即可,无需重复赋值0
根据范围遍历范围内所有可能的猜数情况,根据递推式求出各个情况的保证获胜的最小金额数,将其最小值赋值给dp[i][j]
以下为C++代码:
12345678910111213141516171819202122232425262728293031class Solution {public: int getMoneyAmount(int n) { //动态规划问题,最小现 ...
Leetcode: 495.提莫攻击
495. 提莫攻击
解题思路: 一开始想着直接用set来去重,结果肯定是直接超时了。 后续考虑到给出的timeSeries是非递减的形式,可以用单次遍历的方法,用t存储下当前中毒结束时间。
当t<timeSeries[i]+duration时,表示着这个结束时间需要刷新,因此先对结果res+=timeSeries[i]+duration-t-max(timeSeries[i]-t,0) (后续的max是因为考虑到若中途有非中毒时间要减去),同时更新t=timeSeries[i]+duration
以下为C++代码:
1234567891011121314151617181920212223242526class Solution {public: int findPoisonedDuration(vector<int>& timeSeries, int duration) { //用hashset记录下时间节点去重,最后获取其size()即可获得秒数(超时) // set<int& ...
Leetcode: 488.祖玛游戏
488. 祖玛游戏
解题思路: 在刚开始看题时虽然想到了可能要用dfs来解决,但是对于每次插入球后的消球过程没有特别好的解决思路,后续参考了其他的题解后才得到了快慢指针用于处理插入球后的消除过程的Update思路,并且也考虑到了记忆化搜索优化超时。
整个解题过程分为两个阶段,DFS+记忆化搜索+回溯与每次插入后的消除过程
每次插入后的消除过程采用了快慢指针的方式,设slow指针和fast指针的初始值为0,fast遍历插入球后的整个字符串。
若fast<board.size()且board[fast]==board[slow]则代表当前slow和fast所指代的球的颜色是相同的,进行continue的操作
若fast-slow>=3则代表当前慢指针slow到快指针fast之间为三个或三个颜色相同以上的球,因此用string.erase来进行消除操作,同时设fast=0,需要重新进行遍历
每次遍历结束的末尾需要将slow=fast,因为当前指代的是fast与slow中指代的不是相同颜色的球,所以slow的判断可以继续往下来搜索。
主函数通过DFS+记忆化搜索+回溯 ...
Leetcode 299.猜数字游戏
299. 猜数字游戏
解题思路: 这题公牛是比较好求的,遍历secret和guess判断对应字符是否相等即可,但是奶牛的思路需要转换,题目中的含义是数字猜对但是位置不对,这里可以分为两种情况。
在对应位置上不相同时,secret中该数字的出现次数比guess少,这时对于guess来说只能填补secret字符中该数字的个数,guess多出字符无用,所以结果应取secret中该数字的次数
在对应位置上不相同时,secret中该数字的出现次数比guess多,这时对于guess来说只能填补自身数量的secret字符,secret多出字符无用,所以结果应取guess中该数字出现的次数
综上所述其实可以把奶牛的求解通过这样的方式:用哈希表arr1和arr2分别存储secret和guess中对应数字的存储次数,而后对于每个数字来说求arr1与arr2中对应数字的最小值,其的和为奶牛的个数。
以下是C++代码:
1234567891011121314151617181920212223242526class Solution {public: string getHint( ...
Leetcode: 598.范围求和 II
598. 范围求和 II
解题思路: 这题可以将思路转变为求operations中所表示的所有矩形中相交最多次数的矩形面积,同时根据题目要求,其每个矩形都是以左上角为起点,这样就转换为了求operations中代表矩形的长、宽的最小值,其相乘即为最终结果,同时长、宽的初始值为m,n。
以下为C++代码:
12345678910111213class Solution {public: int maxCount(int m, int n, vector<vector<int>>& ops) { //这题可以引申为求包围的最小的矩形面积 int w=m,h=n; int len=ops.size(); for(int i=0;i<len;i++){ w=min(ops[i][0],w); h=min(ops[i][1],h); } return w*h; } ...
Leetcode: 268.丢失的数字
268. 丢失的数字
解题思路: 这题比较简单,用哈希表记录下出现的次数,然后找到哈希表中value为0的唯一值即可。
以下是C++代码:
123456789101112131415161718class Solution {public: int missingNumber(vector<int>& nums) { //用哈希表记录下出现的数字 int len=nums.size()+1; int *arr=new int[len](); for(auto num:nums){ arr[num]++; } //找到arr中值为0的元素 for(int i=0;i<len;i++){ if(arr[i]==0) return i; } return -1; }};
Leetcode: 1218.最长定差子序列
1218. 最长定差子序列
解题思路: 这题是动态规划的题目,其实往深了看可以作为一个背包问题,arr中元素为每件物品的权重,而等差数列则是每件物品权重判断的条件,在内部将背包问题中的max()求最大存储物品数量改为等差数列长度+1。
方法思路:
map第一个元素表示符合等差数列的最后一个元素,第二个表示该等差数列的长度
遍历arr的元素,若m不存在则加入其中,若存在则获取其长度后+1赋值给当前元素对应值
以下为C++代码:
12345678910111213141516171819class Solution {public: int longestSubsequence(vector<int>& arr, int difference) { //动态规划 //第一个元素表示符合等差数列的最后一个元素,第二个表示该等差数列的长度 //遍历arr的元素,若m不存在则加入其中,若存在则获取其长度后+1赋值给当前元素对应值 unordered_map<int,int> ...