Leetcode刷题(81~90)

发布于:2024-12-18 ⋅ 阅读:(74) ⋅ 点赞:(0)

算法是码农的基本功,也是各个大厂必考察的重点,让我们一起坚持写题吧。

遇事不决,可问春风,春风不语,即是本心。

我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就可以啦,慢慢来,会很快,向前走,别回头。

1、搜索旋转排序数组II

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/search-in-rotated-sorted-array-ii/description/

思路:直接一个for循环就解决了,没看懂这个题目想干什么,有点意思。

Java版:

class Solution {
    public boolean search(int[] nums, int target) {
        for(int i=0; i<nums.length; i++){
            if(target == nums[i]){
                return true ;
            }
        }
        return false ;
    }
}

2、删除排序链表中的重复元素II

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/description/

思路:用map记录一下元素个数,当前元素个数大于1则跳过,否则摘下来拼接成链表。

Java版:
 

/**
 * 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 ListNode deleteDuplicates(ListNode head) {
        Map<Integer, Integer> map = new HashMap<>() ;
        ListNode cur = head ;
        while(cur != null){
            if(map.get(cur.val) != null){
                map.put(cur.val, map.get(cur.val) + 1) ;
            }else{
                map.put(cur.val, 1) ;
            }
            cur = cur.next ;
        }
        ListNode res = new ListNode(-1) ;
        ListNode ans = res ;
        while(head != null){
            if(map.get(head.val) == 1){
                res.next = new ListNode(head.val) ;
                res = res.next ;
            }
             head = head.next ;
        }
        return ans.next ;
    }
}

3、删除链表中重复元素

题目链接:. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/remove-duplicates-from-sorted-list/

思路:记录元素出现次数,超过一次则删除当前节点即可。

Java版:

/**
 * 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 ListNode deleteDuplicates(ListNode head) {
        Map<Integer, Integer> map = new HashMap<>() ;
        ListNode ans = new ListNode(0);
        ListNode res = ans ;
        while(head != null){
            if(map.get(head.val) == null){
                map.put(head.val, 1);
                ans.next = new ListNode(head.val) ;
                ans = ans.next ;
            }else{
                head = head.next ;
            }
        }
        return res.next ;
    }
}

4、分割链表

题目链接:86. 分隔链表 - 力扣(LeetCode)86. 分隔链表 - 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。 示例 1:[https://assets.leetcode.com/uploads/2021/01/04/partition.jpg]输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]示例 2:输入:head = [2,1], x = 2输出:[1,2] 提示: * 链表中节点的数目在范围 [0, 200] 内 * -100 <= Node.val <= 100 * -200 <= x <= 200icon-default.png?t=O83Ahttps://leetcode.cn/problems/partition-list/description/

思路:遍历原始链表,维护两个链表,第一个链接存储小于x节点,第二个链表存储大雨等于x节点。然后两个链表拼接在一起。

Java版:
 

/**
 * 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 ListNode partition(ListNode head, int x) {
        if(head == null || head.next == null){
            return head ;
        }
        // 维护两个链表,小于x的放到第一个链表,大于等于x的放到第二个链表
        ListNode smart = new ListNode(head.val);
        ListNode left = smart;
        ListNode big = new ListNode(head.val) ;
        ListNode right = big;
        while(head != null){
            if(head.val<x){
                smart.next = new ListNode(head.val);
                smart = smart.next;
            }else{
                big.next = new ListNode(head.val);
                big = big.next;
            }
            head = head.next;
        }
        smart.next = right.next;
        return left.next;
    }
}

5、合并两个有序数组

题目链接:88. 合并两个有序数组 - 力扣(LeetCode)88. 合并两个有序数组 - 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。 示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]解释:需要合并 [1,2,3] 和 [2,5,6] 。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。示例 2:输入:nums1 = [1], m = 1, nums2 = [], n = 0输出:[1]解释:需要合并 [1] 和 [] 。合并结果是 [1] 。示例 3:输入:nums1 = [0], m = 0, nums2 = [1], n = 1输出:[1]解释:需要合并的数组是 [] 和 [1] 。合并结果是 [1] 。注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。 提示: * nums1.length == m + n * nums2.length == n * 0 <= m, n <= 200 * 1 <= m + n <= 200 * -109 <= nums1[i], nums2[j] <= 109 进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?icon-default.png?t=O83Ahttps://leetcode.cn/problems/merge-sorted-array/

思路:

1.简单拼接后排序即可

Java版:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        for(int i=0; i<n; i++){
            nums1[i+m] = nums2[i];
        }
        Arrays.sort(nums1);
    }
}

6、子集II

题目链接:90. 子集 II - 力扣(LeetCode)90. 子集 II - 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 示例 1:输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]示例 2:输入:nums = [0]输出:[[],[0]] 提示: * 1 <= nums.length <= 10 * -10 <= nums[i] <= 10icon-default.png?t=O83Ahttps://leetcode.cn/problems/subsets-ii/description/

思路:递归+回溯+标记

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    List<Integer> tmp = new ArrayList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        dfs(false,nums,0);
        return ans;
    }
    public void dfs(boolean vis, int [] nums, int cur){
        if(cur==nums.length){
            ans.add(new ArrayList<>(tmp));
            return;
        }
        dfs(false,nums,cur+1);
        if(!vis && cur>0 && nums[cur]==nums[cur-1]){
            return;
        }
        tmp.add(nums[cur]);
        dfs(true,nums,cur+1);
        tmp.remove(tmp.size()-1);
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到