> 文档中心 > LeetCode双周赛73(Cpp+Golang)

LeetCode双周赛73(Cpp+Golang)

竞赛 - 力扣 (LeetCode)

6024. 数组中紧跟 key 之后出现最频繁的数字

题意

        给定一个数组,要求找出所有在key之后出现的数字当中,频数最高的那个数

思路

        用一个map保存出现次数,遍历一遍之后返回结果

代码(Cpp):

class Solution {public:    int mostFrequent(vector& nums, int key) { mapmp; int id=0,maxx=0; for(int i=1;imaxx){      maxx=mp[nums[i]];      id=nums[i];     }} } return id;    }};

5217. 将杂乱无章的数字排序

题意:

        给定一个数组和一个映射规则,要求将数组中的数字转换为映射之后的数字,进行排序,根据映射值的大小排序原数组的值,要求是一个稳定的排序,即相同映射值的数据相对位置不变。

思路:

        直接模拟,转换成字符串,根据映射替换,求出映射值,然后排序,用一个结构体保存原数据、映射值、原位置。

代码(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 sortJumbled(vector& mapping, vector& nums) { vectorp(nums.size()); int n=nums.size(); for(int i=0;i<n;i++){     stringstream ss;     string s;     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;    }};

5300. 有向无环图中一个节点的所有祖先

题意:

        给定一个有向无环图,要求找出该节点的所有祖先。

思路:

        这题比赛过程中没有做出来。思路来源榜一大哥。

        利用 bitset 进行化简运算,对于条有向边,用a[i] |= a[k] 表示将 k 的所有父节点赋值到 i 结点上,最后根据操作结果将所有节点的祖先保存为二维数组并返回。

代码author:

wwwwoddddhttps://leetcode-cn.com/u/wwwwodddd/

代码(Cpp):

class Solution {public:    vector<vector> getAncestors(int n, vector<vector>& e) { bitset 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 > z; for (int i = 0; i < n; i++) {     vector b;     for (int j = 0; j < n; j++)     {  if (a[j][i])  {      b.push_back(j);  }     }     z.push_back(b); } return z;    }};

5237. 得到回文串的最少操作次数

题意:

        给定一个字符串,每次操作是交换相邻的两个字符,要求用最少的次数使得该字符串变成回文串。

思路一:

        贪心。没做出来,根据TsReaper的题解

        每次将第一个字符固定,从末端寻找相同字符,移到当前状态的末端。下一次从前端第二个字符开始,重复该算法。以此将问题分割成一系列子问题。如果找不到,就要将当前首字符移动到字符串的中间位置。

代码一(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     }}

思路二:

        根据zerotrac的题解。将问题转换为一个逆序对问题,用树状数组求解。