当前位置: 首页 > article >正文

力扣-数据结构-4【算法学习day.75】

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.链表最大孪生和

题目链接:2130. 链表最大孪生和 - 力扣(LeetCode)

题面:

分析:这题可以先把值存入数组,然后慢慢求最大值,也可以使用快慢指针,找到中间节点后将前一半的链表反转,此时一个节点从前一半的头结点出发,另一个节点从剩下一般的头节点开始出发,然后求最大值即可

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public int pairSum(ListNode head) {
        int[] arr= new int[100005];
        int count = 0;
        for(ListNode i = head;i!=null;i=i.next){
            arr[count++] = i.val;
        }
        int ans = -1;
        for(int i = 0;i<=(count/2)-1;i++){
            ans = Math.max(ans,(arr[i]+arr[count-1-i]));
        }
        return ans;
    }
}

2.重排链表

题目链接:143. 重排链表 - 力扣(LeetCode) 

题面:

分析:这题同样可以利用快慢指针来找到链表的中间节点,然后将后半部分反转,之后用两个指针分别指向两个链表的头部,然后开始依次交替遍历并拼接到头节点上去即可

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public void reorderList(ListNode head) {
        if(head!=null&&head.next!=null){
            
        ListNode slow = head;
        ListNode fast = head;
        ListNode fpre = head;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            fpre = slow;
            slow = slow.next;
        }
        fpre.next = null;
        ListNode rtall = null;
        ListNode rhead = null;
        ListNode pre = rtall;
        while(slow!=null){
            ListNode node = slow.next;
            slow.next = pre;
            pre = slow;
            if(node==null){
                rhead = slow;
            }
            slow = node;
        }
        int count = 1;
        ListNode fhead = new ListNode();
        ListNode apre = fhead;
        // for(ListNode i = head;i!=null;i=i.next){
        //     System.out.println(i.val);
        // }
        //     System.out.println("___________________________");
        // for(ListNode i = rhead;i!=null;i=i.next){
        //      System.out.println(i.val);
        // }
        for(ListNode i = head,j = rhead;i!=null||j!=null;){
            if(count%2==1&&i!=null){
                apre.next = i;
                apre = i;
                i=i.next;
            }else if(count%2==0&&j!=null){
                apre.next = j;
                apre = j;
                j = j.next;
            }
            count++;
        }
        }
    }
}

3.环形数组是否存在循环

题目链接:457. 环形数组是否存在循环 - 力扣(LeetCode) 

分析:可以使用并查集也可以使用快慢双指针

代码:

class Solution {
    int[] p;
    public boolean circularArrayLoop(int[] nums) {
        int n = nums.length;
        p = new int[n];
        for(int i = 0;i<n;i++){
            p[i] = i;
        }
        for(int i = 0;i<n;i++){
           int flag = nums[i]+i;
           if(flag>=n)flag%=n;
           if(flag<0){
            while(flag<0){
                flag+=n;
            }
           }
           if(i==flag)continue;
           if(nums[i]*nums[flag]>0){
            if(connected(i,flag)){
                return true;
            }
            union(i,flag);
           }
        }
        // for(int i = 0;i<n;i++){
        //     System.out.println(p[i]);
        // }
        return false;
        
    }

    public int find2(int x){
        if(x!=p[x]){
            p[x] = find2(p[x]);
        }
        return p[x];
    }

    public void union(int x,int y){
        int px = find2(x);
        int py = find2(y);
        if(px!=py){
            p[px] = py;
        }
    }

    public boolean connected(int x,int y){
        return find2(x)==find2(y);
    }
}

后言

上面是数据结构相关的习题,下一篇文章会将其他相关的习题。

 

 

 


http://www.kler.cn/a/454531.html

相关文章:

  • EleutherAI/pythia-70m
  • 联通移动大内网如何使用plex流媒体服务器
  • 讲一个自己写的 excel 转 html 的 java 工具
  • 三只脚的电感是什么东西?
  • Unity2021.3.16f1可以正常打开,但是Unity2017.3.0f3却常常打开闪退或者Unity2017编辑器运行起来就闪退掉
  • 更改 pnpm 的全局存储位置
  • User Script Sandboxing作用 及 在iOS项目中获取GitCommitHash
  • MacOS安装Xcode(非App Store)
  • 2-197 基于matlab的生物地理学优化算法(BBO)在无人机三维航迹规划中的应用
  • Nature+Science=ONNs(光学神经网络)
  • html文件通过script标签引入外部js文件,但没正确加载的原因
  • 1_H5视频播放器-1 -- [前端开发之道:通过实例掌握编程思维]
  • Centos7配置webrtc-streamer环境
  • 识别后端返回的字符串中携带的空格 以及换行 要在前端展示 v-html
  • Python初识
  • MySQL从入门到入土---MySQL表的约束 (内含实践)---详细版
  • 火山引擎边缘云全面升级智能边缘,推动 AI 应用场景拓展与技术创新
  • K8s 常用资源介绍
  • clickhouse测试报告
  • Git如何设置和修改当前分支跟踪的上游分支