首页 > 其他分享 >leetcode周赛 - 406

leetcode周赛 - 406

时间:2024-07-14 23:54:14浏览次数:12  
标签:周赛 cos int ++ leetcode 406 num verticalCut horizontalCut

100352. 交换后字典序最小的字符串

  给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的字典序最小的字符串。

  如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5 和 9、2 和 4 奇偶性相同,而 6 和 9 奇偶性不同。

思路

  从左到右扫一遍就行,交换的越早越好,因为字典序是从左往右看的

import java.util.Arrays;

class Solution {
    public String getSmallestString(String s) {
        char[] charArray = s.toCharArray();
        for (int i = 0; i < charArray.length - 1; i++) {
            int now = charArray[i] - '0', nxt = charArray[i + 1] - '0';
            if (now % 2 == nxt % 2 && now > nxt) {
                char tmp = charArray[i];
                charArray[i] = charArray[i + 1];
                charArray[i + 1] = tmp;
                break;
            }
        }
        return new String(charArray);
    }
}

100368. 从链表中移除在数组中存在的节点

  给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。

思路

  将nums转成一个set,就能在O(1)的时间内判断当前节点值在不在nums里,然后扫一遍维护指针就行

  当然还有一种方法是记录那些没在nums里的节点值,重新做一个链表出来返回

import java.util.HashSet;
import java.util.Set;
class Solution {
    public ListNode modifiedList(int[] nums, ListNode head) {
        if (head == null) return null;
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        ListNode newHead = head;
        while (newHead != null && set.contains(newHead.val)) newHead = newHead.next;
        if (newHead == null) return null;
        ListNode pre = newHead;
        while (pre.next != null) {
            ListNode now = pre.next;
            if (set.contains(now.val)) {
                pre.next = findNewNextNode(set, now);
                if (pre.next != null) pre = pre.next;
                continue;
            }
            pre = now;
        }
        return newHead;
    }

    private ListNode findNewNextNode(Set<Integer> set, ListNode now) {
        ListNode ans = now;
        while (set.contains(ans.val)) {
            ans = ans.next;
            if (ans == null) break;
        }
        return ans;
    }
}

100361. 切蛋糕的最小总开销 I

有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。

给你整数 m ,n 和两个数组:

  • horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。
  • verticalCut 的大小为 n - 1 ,其中 verticalCut[j] 表示沿着垂直线 j 切蛋糕的开销。

一次操作中,你可以选择任意不是 1 x 1 大小的矩形蛋糕并执行以下操作之一:

  1. 沿着水平线 i 切开蛋糕,开销为 horizontalCut[i] 。
  2. 沿着垂直线 j 切开蛋糕,开销为 verticalCut[j] 。

每次操作后,这块蛋糕都被切成两个独立的小蛋糕。

每次操作的开销都为最开始对应切割线的开销,并且不会改变。

请你返回将蛋糕全部切成 1 x 1 的蛋糕块的 最小 总开销。

思路

  当你横着切一刀时,竖着切时都要加一刀,竖着切同理,所以我们想每次切大的花费的边,这样就不会重复切多次。把横边和竖边降序排序,维护两个多切系数,每次选择横边和竖边较大的那边来切,同时维护多切系数,横的切一刀,竖边的多切系数就要+1,反之同理

import java.util.Arrays;

class Solution {
    public static int minimumCost(int m, int n, int[] horizontalCut, int[] verticalCut) {
        int cos = 0;
        int horizonNum = 1, verticalNum = 1;
        reverseOrderQuickSort(horizontalCut, 0, horizontalCut.length - 1);
        reverseOrderQuickSort(verticalCut, 0, verticalCut.length - 1);
        int i = 0, j = 0;
        while (i < horizontalCut.length || j < verticalCut.length) {
            if (i == horizontalCut.length) {
                cos += verticalCut[j] * verticalNum;
                j++;
                continue;
            }
            if (j == verticalCut.length) {
                cos += horizontalCut[i] * horizonNum;
                i++;
                continue;
            }
            if (horizontalCut[i] > verticalCut[j]) {
                cos += horizontalCut[i] * horizonNum;
                verticalNum++;
                i++;
            } else {
                cos += verticalCut[j] * verticalNum;
                horizonNum++;
                j++;
            }
        }
        return cos;
    }

    private static void reverseOrderQuickSort(int[] num, int left, int right) {
        if (left < right) {
            int i = left, j = right, n = num[left];
            while (i < j) {
                while (i < j && num[j] <= n) j--;
                if (i < j) num[i++] = num[j];
                while (i < j && num[i] > n) i++;
                if (i < j) num[j--] = num[i];
            }
            num[i] = n;
            reverseOrderQuickSort(num, left, i - 1);
            reverseOrderQuickSort(num, i + 1, right);
        }
    }
}

100367. 切蛋糕的最小总开销 II

  题意和刚刚一样,在刚刚的基础上增大n和m的数据量

思路

  和第三题是一样的,我的解法tle了,时间复杂度应该是一样的,问题应该是手写的快排没有jdk的速度快,用jdk的api就能AC

import java.util.Arrays;

class Solution {
    public long minimumCost(int m, int n, int[] horizontalCut, int[] verticalCut) {
        long cos = 0;
        int horizonNum = 1, verticalNum = 1;
        Arrays.sort(horizontalCut);
        Arrays.sort(verticalCut);
        int i = horizontalCut.length - 1, j = verticalCut.length - 1;
        while (i >= 0 || j >= 0) {
            if (j < 0 || i >= 0 && horizontalCut[i] > verticalCut[j]) {
                cos += (long) horizontalCut[i] * horizonNum;
                verticalNum++;
                i--;
            } else {
                cos += (long) verticalCut[j] * verticalNum;
                horizonNum++;
                j--;
            }
        }
        return cos;
    }
}

 

标签:周赛,cos,int,++,leetcode,406,num,verticalCut,horizontalCut
From: https://www.cnblogs.com/CNLayton/p/18302224

相关文章

  • 牛客周赛 Round 51
    A.小红的同余思路+解法:找到唯一一个x满足2x%m=1(0<=x<m)  就可以推出(m+1)*2即可Code: #include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);intm;cin>>m;......
  • 2024/7/14 每日一题 + 周赛P3/P4
    807.保持城市天际线问题描述给你一座由nxn个街区组成的城市,每个街区都包含一座立方体建筑。给你一个下标从0开始的nxn整数矩阵grid,其中grid[r][c]表示坐落于r行c列的建筑物的高度。城市的天际线是从远处观察城市时,所有建筑物形成的外部轮廓。从东、南......
  • LeetCode 144. 二叉树的前序遍历
    更多题解尽在https://sugar.matrixlab.dev/algorithm每日更新。组队打卡,更多解法等你一起来参与哦!LeetCode144.二叉树的前序遍历,难度中等。classSolution{publicvoidpreorderTraversal(TreeNoderoot,List<Integer>ans){if(root==null)re......
  • 24暑假算法刷题 | Day11 | LeetCode 150. 逆波兰表达式求值,239. 滑动窗口最大值,347.
    目录150.逆波兰表达式求值题目描述题解239.滑动窗口最大值题目描述题解347.前K个高频元素题目描述题解150.逆波兰表达式求值点此跳转题目链接题目描述给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个......
  • 24暑假算法刷题 | Day9 | LeetCode 151. 反转字符串中的单词,28. 找出字符串中第一个匹
    目录151.反转字符串中的单词题目描述题解28.找出字符串中第一个匹配项的下标题目描述题解459.重复的子字符串题目描述题解卡码网55.右旋字符串题目描述题解151.反转字符串中的单词点此跳转题目链接题目描述给你一个字符串s,请你反转字符串中单词的顺......
  • [20240618]Oracle C functions annotations.txt
    [20240618]OracleCfunctionsannotations.txt--//网站orafun.info可以查询oraclecfunctions.CreatedbyFritsHooglandwithalittlehelpfromKamilStawiarski.--//可以通过它了解oracle内部C函数.实际上可以直接下载相关文件,在本地使用.https://gitlab.com/FritsHoog......
  • 一起学习LeetCode热题100道(11/100)
    11.滑动窗口最大值(学习)给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例1:输入:nums=[1,3,-1,-3,5,3,6,7],k=3输出:[3,3,5,......
  • LeetCode 3091. 执行操作使数据元素之和大于等于 K(贪心、数学)
    3091.执行操作使数据元素之和大于等于K思路:数学思维题。先执行操作一让1加到k的平方根向上取整的数t,然后执行操作二,达到数组和>=k即可。classSolution{public:intminOperations(intk){intt=ceil(sqrt(k));return(k+t-1)/t+t-2;}......
  • LeetCode 125. 验证回文串
    更多题解尽在https://sugar.matrixlab.dev/algorithm每日更新。组队打卡,更多解法等你一起来参与哦!LeetCode125.验证回文串,难度简单。双指针解题思路:遍历字符串,将所有大写字符转换为小写字符、并移除所有非字母数字字符;使用左右指针比较字符,出现不同则直接返回fa......
  • [LeetCode]961. 在长度 2N 的数组中找出重复 N 次的元素
    /*961.在长度2N的数组中找出重复N次的元素已解答简单给你一个整数数组nums,该数组具有以下属性:nums.length==2*n.nums包含n+1个不同的元素nums中恰有一个元素重复n次找出并返回重复了n次的那个元素。示例1:输入:nums=[1,2,3,3]输出:3示例2:输入......