• 【leetcode周赛总结】


    目录

    题目1 使数组中所有元素都等于零

    思路

    代码

    题目2 分组的最大数量

    思路

    代码

    题目3 找到离给定两个节点最近的节点

    思路

    代码

    题目4 图中的最长环

    思路

    代码


    题目1 使数组中所有元素都等于零

    思路

     这个题目的思路非常简单和清晰,但我一开始理解有一些问题,直接用一个set记录不同的数字的个数即可。

    代码

    1. class Solution {
    2. public int minimumOperations(int[] nums) {
    3. Set st = new HashSet<>();
    4. for(int num:nums){
    5. if(num!=0){
    6. st.add(num);
    7. }
    8. }
    9. return st.size();
    10. }
    11. }

    题目2 分组的最大数量

    思路

    一开始没有思路,其实这题的思路就是贪心,因为一旦数组排好序,以1,2,3的大小去组成这样的分组就可以符合题目的要求,剩下的不足分组可以直接加到最后一组。

    代码

    1. class Solution {
    2. public int maximumGroups(int[] grades) {
    3. //Arrays.sort(grades);
    4. int n = grades.length;
    5. int i = 1;
    6. int count = 0;
    7. while(n>=i){
    8. n-=i;
    9. i++;
    10. count++;
    11. }
    12. return count;
    13. }
    14. }

    题目3 找到离给定两个节点最近的节点

    思路

    一开始思路是从两个节点然后去找一个交汇的点,但是这样找的话两个节点的移动速度不一样,不是很好实现,这个思路不对。

    解题思路就是和题目类似的,维护两个数组

    d1记录node1到各个节点的距离  初始化为最大值

    d2记录node2到各个节点的距离  初始化为最大值

    遍历所有的节点0<=i

    特殊情况是 

    1->2  2->1  这种成环的图可能返回的不是唯一答案

      

    代码

    1. class Solution {
    2. public int closestMeetingNode(int[] edges, int node1, int node2) {
    3. //d1记录node1到各个节点的距离 初始化为最大值
    4. //d2记录node2到各个节点的距离 初始化为最大值
    5. int n = edges.length;
    6. int[] d1 = new int[n];
    7. int[] d2 = new int[n];
    8. for(int i=0;i
    9. d1[i] = n;
    10. d2[i] = n;
    11. }
    12. bfs(d1,node1,edges);
    13. bfs(d2,node2,edges);
    14. int ans = n;
    15. int node = -1;
    16. for(int i=0;i
    17. if(Math.max(d1[i],d2[i])
    18. ans = Math.max(d1[i],d2[i]);
    19. node = i;
    20. }
    21. }
    22. return node;
    23. }
    24. private void bfs(int[] d,int node,int[] edges){
    25. int n = edges.length;
    26. for(int i=0;node>=0 && d[node]==n;node = edges[node]){ //node>=0没有越界 而且 d[node]==n没有访问过
    27. d[node] = i++;
    28. }
    29. }
    30. }

    题目4 图中的最长环

    思路

    方法一 dfs直接遍历

    方法二  拓扑排序 找到不在环内的直接用vis标记,不用再用新的数组

    代码

    方法一 自己写的dfs 总觉得有一些细节没想明白

    1. class Solution {
    2. int res = -1;
    3. int[] vis;
    4. int[] cnts;
    5. public int longestCycle(int[] edges) {
    6. int n = edges.length;
    7. vis = new int[n];
    8. cnts = new int[n];
    9. for(int i=0;i
    10. dfs(i,edges,0);
    11. }
    12. return res;
    13. }
    14. public boolean dfs(int i,int[] edges,int cnt){
    15. if(vis[i]==1){
    16. res = Math.max(res,cnt-cnts[i]);
    17. return false;
    18. }
    19. if(vis[i]==-1) return true;
    20. vis[i] = 1;
    21. cnts[i] = cnt;
    22. if(edges[i]!=-1){
    23. if(!dfs(edges[i],edges,cnt+1)) return false;
    24. }
    25. vis[i] = -1;
    26. return true;
    27. }
    28. }

    方法二

    1. class Solution {
    2. public int longestCycle(int[] edges) {
    3. int n = edges.length;
    4. int[] inDegree = new int[n]; //入度表
    5. for(int i=0;i
    6. if(edges[i]!=-1)
    7. inDegree[edges[i]]++;
    8. }
    9. Deque q = new ArrayDeque<>();
    10. for(int i=0;i
    11. if(inDegree[i]==0){
    12. q.offer(i);
    13. }
    14. }
    15. boolean[] vis = new boolean[n];
    16. int cnt = 0;
    17. while(!q.isEmpty()){
    18. int cur = q.poll();
    19. cnt++;
    20. vis[cur] = true;
    21. if(edges[cur]!=-1){
    22. int nxt = edges[cur];
    23. inDegree[nxt]--;
    24. if(inDegree[nxt]==0) q.offer(nxt);
    25. }
    26. }
    27. //如何快速判断有无环
    28. if(cnt==n) return -1;
    29. int ans = -1;
    30. for(int i=0;i
    31. if(!vis[i] ){
    32. ans = Math.max(ans,bfs(i,edges,vis));
    33. }
    34. }
    35. return ans;
    36. }
    37. private int bfs(int node,int[] edges,boolean[] vis){
    38. int len = 0;
    39. while(node>=0 && !vis[node]){
    40. vis[node] = true;
    41. node = edges[node];
    42. len++;
    43. }
    44. return len;
    45. }
    46. }

    方法三  记录访问时间法

    利用时间戳找环

    代码

    1. class Solution {
    2. public int longestCycle(int[] edges) {
    3. int n = edges.length;
    4. int clk = 1; //全局访问时间
    5. int ans = -1;
    6. int[] time = new int[n];
    7. for(int i=0;i
    8. if(time[i]>0) continue;
    9. int start_time = clk;
    10. for(int node = i;node>=0;node=edges[node]){
    11. if(time[node]>0){
    12. if(time[node]>=start_time){
    13. ans = Math.max(ans,clk-time[node]);
    14. }
    15. break;
    16. }
    17. time[node] = clk++;
    18. }
    19. }
    20. return ans;
    21. }
    22. }

  • 相关阅读:
    ASEMI肖特基二极管SBT40100VFCT规格,SBT40100VFCT封装
    vite的使用
    今日睡眠质量记录61分
    ESP8266--SDK开发(驱动WS2812B)
    安全保障基于软件全生命周期-NetworkPolicy应用
    PHP 命名空间
    自学java怎么入门?
    数据库pymsql之使用简单登陆注册功能实现
    大模型时代的具身智能系列专题(六)
    3D 三角形的顶点顺序
  • 原文地址:https://blog.csdn.net/weixin_40760678/article/details/126123760