leetcode 2542. Maximum Subsequence Score(最大子串分数)

该文章介绍了一个算法问题,目标是找到两个相同长度的数组中k个对应下标的元素组合,使得nums1元素之和与nums2最小k个元素的乘积最大。解决方案是将数组按nums2降序排列,使用优先队列维护nums1的最大k个元素,动态更新最大得分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

2个数组,长度一样,从中选k个下标(两个数组用同样的下标),
会得到k个nums1中的数字,和k个nums2中的数字。
score = k个nums1的数字之和 ✖ min(k个nums2的数字),
找到最大的score。

思路:

和1383题一样。
每次要和k个nums2的数字中最小的一个相乘。那每次肯定想尽量找大的nums2.
最好是优先取最大的nums2。

那么把nums1[i]和nums2[i]组成一对,作为元素,组成一个数组,按nums2排序。
这样遍历数组时优先取的是较大的nums2.

nums2降序以后,相当于把问题降了一维,现在剩下想取较大的nums1, 才能保证sum(k个nums1)较大。
在nums1的个数 > k个后,去掉其中最小的,更新sum, 个数=k时,更新score.

public long maxScore(int[] nums1, int[] nums2, int k) {
    int n = nums1.length;
    int[][] nums12 = new int[n][2];
    PriorityQueue<Integer> minHeap = new PriorityQueue<>();
    long sum = 0;
    long res = 0;

    for(int i = 0; i < n; i++) {
        nums12[i] = new int[]{nums1[i], nums2[i]};
    }

    Arrays.sort(nums12, (a, b)->(b[1]-a[1]));
    for(int[] num : nums12) {
        sum += num[0];
        minHeap.offer(num[0]);
        if(minHeap.size() > k) sum -= minHeap.poll();
        if(minHeap.size() == k) res = Math.max(res, sum*num[1]);
    }
    return res;
}

还可以优化一下,上面方法是每个nums1都装进minHeap, 然后再考虑去掉,
现在考虑先装入k个数字,
如果后面nums1比minHeap中最小的元素都小,就不需要再装进去。省去一步。

public long maxScore(int[] nums1, int[] nums2, int k) {
    int n = nums1.length;
    int[][] nums12 = new int[n][2]; 
    for(int i =0; i<n; i++){
        nums12[i] = new int[]{nums1[i], nums2[i]}; 
    }
    Arrays.sort(nums12, (a,b)->(b[1]-a[1]));
    long res = -1; 
    PriorityQueue<Integer>  pq = new PriorityQueue<>(k); 
    long sum =0; 
    for(int i = 0; i < k; i++){
         pq.add(nums12[i][0]); 
         sum += nums12[i][0]; 
    }
    res= Math.max(res, (sum * nums12[k-1][1])); 

     for(int i = k; i < n; i++){
        int n1 = nums12[i][0];
        if(n1 > pq.peek()){
            sum -= pq.poll(); 
            pq.add(n1); 
            sum += n1; 
        }
        res= Math.max(res, (sum * nums12[i][1])); 
    }
      return res; 
}
### LeetCode 第 5 题 '最长回文子串' 的 Python 解法 对于给定字符串 `s`,返回其中的最长回文子串是一个经典算法问题。一种高效的解决方案是利用中心扩展方法来寻找可能的最大长度回文。 #### 中心扩展法解析 该方法基于观察到的一个事实:一个回文串可以由中间向两端不断扩散而得。因此可以从每一个字符位置出发尝试构建尽可能大的回文序列[^1]。 具体来说: - 对于每个字符作为单个字符的中心点; - 或者两个相同相邻字符作为一个整体中心点; - 向两侧延伸直到遇到不匹配的情况为止; 记录下每次找到的有效回文串及其起始索引和结束索引,并更新全局最优解。 下面是具体的 Python 实现代码: ```python def longest_palindrome(s: str) -> str: if not s or len(s) == 0: return "" start, end = 0, 0 for i in range(len(s)): len1 = expand_around_center(s, i, i) len2 = expand_around_center(s, i, i + 1) max_len = max(len1, len2) if max_len > end - start: start = i - (max_len - 1) // 2 end = i + max_len // 2 return s[start:end + 1] def expand_around_center(s: str, left: int, right: int) -> int: L, R = left, right while L >= 0 and R < len(s) and s[L] == s[R]: L -= 1 R += 1 return R - L - 1 ``` 此函数通过遍历整个输入字符串并调用辅助函数 `expand_around_center()` 来计算以当前位置为中心能够形成的最长回文串长度。最终得到的结果即为所求的最大回文子串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值