LeetCode双周赛73(Cpp+Golang)
题意:
给定一个数组,要求找出所有在key之后出现的数字当中,频数最高的那个数
思路:
用一个map保存出现次数,遍历一遍之后返回结果
代码(Cpp):
class Solution { public: int mostFrequent(vector<int>& nums, int key) { map<int,int>mp; int id=0,maxx=0; for(int i=1;i<nums.size();i++){ if (nums[i-1]==key){ mp[nums[i]]++; if(mp[nums[i]]>maxx){ maxx=mp[nums[i]]; id=nums[i]; } } } return id; } };
题意:
给定一个数组和一个映射规则,要求将数组中的数字转换为映射之后的数字,进行排序,根据映射值的大小排序原数组的值,要求是一个稳定的排序,即相同映射值的数据相对位置不变。
思路:
直接模拟,转换成字符串,根据映射替换,求出映射值,然后排序,用一个结构体保存原数据、映射值、原位置。
代码(Cpp):
struct node{ int val,id,org; bool operator<(node b){ if (val==b.val)return id<b.id; return val<b.val; } }; class Solution { public: vector<int> sortJumbled(vector<int>& mapping, vector<int>& nums) { vector<node>p(nums.size()); int n=nums.size(); for(int i=0;i<n;i++){ stringstream ss; string s; ss<<nums[i]; ss>>s; int r=0; for(int i=0;i<s.size();i++){ r=r*10+mapping[s[i]-0]; } p[i].val=r,p[i].id=i,p[i].org=nums[i]; } sort(p.begin(),p.end()); for(int i=0;i<n;i++){ nums[i]=p[i].org; } return nums; } };
题意:
给定一个有向无环图,要求找出该节点的所有祖先。
思路:
利用 bitset 进行化简运算,对于条有向边,用a[i] |= a[k] 表示将 k 的所有父节点赋值到 i 结点上,最后根据操作结果将所有节点的祖先保存为二维数组并返回。
代码author:
代码(Cpp):
class Solution { public: vector<vector<int>> getAncestors(int n, vector<vector<int>>& e) { bitset<1000> a[1000]; for (int i = 0; i < e.size(); i++) { a[e[i][0]][e[i][1]] = 1; } for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { if (a[i][k]) { a[i] |= a[k]; } } } vector<vector<int> > z; for (int i = 0; i < n; i++) { vector<int> b; for (int j = 0; j < n; j++) { if (a[j][i]) { b.push_back(j); } } z.push_back(b); } return z; } };
题意:
给定一个字符串,每次操作是交换相邻的两个字符,要求用最少的次数使得该字符串变成回文串。
思路一:
贪心。没做出来,根据
每次将第一个字符固定,从末端寻找相同字符,移到当前状态的末端。下一次从前端第二个字符开始,重复该算法。以此将问题分割成一系列子问题。如果找不到,就要将当前首字符移动到字符串的中间位置。
代码一(Golang):
func minMovesToMakePalindrome(s string) int { n,ans:=len(s),0 sb:=make([]byte,n) for i:=range s{ sb[i]=s[i] } for i,j:=0,n-1;i<j;i++{ for k:=j;i!=k;k--{ if sb[i]==sb[k]{ for ;k<j;k++{ sb[k],sb[k+1]=sb[k+1],sb[k] ans++ } } } ans+=n-i+1 } }
思路二:
根据。将问题转换为一个逆序对问题,用树状数组求解。