LeetCode --- 452周賽

題目列表

3566. 等積子集的劃分方案
3567. 子矩陣的最小絕對差
3568. 清理教室的最少移動
3569. 分割數組后不同質數的最大數目

一、等積子集的劃分方案

在這里插入圖片描述
由于本題的數據范圍不大,我們可以暴力枚舉所有可能的劃分方式,代碼如下

// C++
class Solution {
public:bool checkEqualPartitions(vector<int>& nums, long long target) {int n = nums.size();// 用二進制位的 0/1 對 nums 進行劃分for(int i = 1; i < (1 << n) - 1; i++){long long mul[2] = {1, 1};for(int j = 0; j < n; j++){mul[i >> j & 1] *= nums[j];if(mul[i >> j & 1] > target){ // 在計算的過程中進行數值判斷,防止數據超范圍break;}}if(mul[0] == target && mul[1] == target){return true;}}return false;}
};
# Python
class Solution:def checkEqualPartitions(self, nums: List[int], target: int) -> bool:n = len(nums)for i in range(1, 1 << n):mul = [1, 1]for j in range(n):mul[i >> j & 1] *= nums[j]if mul[i >> j & 1] > target:breakif mul[0] == target and mul[1] == target:return Truereturn False

二、子矩陣的最小絕對差

在這里插入圖片描述
由于數據范圍不大,直接暴力模擬即可,代碼如下

// C++
class Solution {
public:vector<vector<int>> minAbsDiff(vector<vector<int>>& grid, int k) {int n = grid.size(), m = grid[0].size();auto oneMinAbsDiff = [&](int x, int y)->int{set<int> st;for(int i = 0; i < k; i++){for(int j = 0; j < k; j++){st.insert(grid[x + i][y + j]);}}if(st.size() == 1) return 0;int ret = INT_MAX;for(auto it = ++st.begin(); it != st.end(); ++it){ret = min(ret, *it - *prev(it));}return ret;};vector ans(n - k + 1, vector<int>(m - k + 1));for(int i = 0; i <= n - k; i++){for(int j = 0; j <= m - k; j++){ans[i][j] = oneMinAbsDiff(i, j);}}return ans;}
};
# Python
class Solution:def minAbsDiff(self, grid: List[List[int]], k: int) -> List[List[int]]:n, m = len(grid), len(grid[0])ans = [[0] * (m - k + 1) for _ in range(n - k + 1)]for i in range(n - k + 1):rows = grid[i:i+k]for j in range(m - k + 1):a = []for row in rows:a.extend(row[j:j + k])a.sort()mn = inffor x, y in pairwise(a):if y > x:mn = min(mn, y - x)if mn < inf:ans[i][j] = mnreturn ans

三、清理教室的最少移動

在這里插入圖片描述
求最短路徑問題一般考慮 bfs、dfs 或者更高級的圖的相關算法,本題用 bfs 就可以,但是我們一般寫 bfs 只考慮走的步數,更復雜一些的會有障礙物,需要判斷哪些結點不能走,為了防止結點重復走,還需要有一個 vis數組 標記走過的結點
本題的難點在于學生移動需要有能量,而某些結點能恢復能量,同時,對垃圾的收集的順序不同,也會導致不同的步數,所以對于一個網格是否被標記為遍歷過,還需要有額外的參數進行判斷。

  • 如何設計 vis數組 的參數?

    • 基本參數,當前網格的位置信息 (x,y)
    • 走到當前網格所剩的能量 energy
    • 剩余還有哪些垃圾需要被處理,本參數記為 mask 由二進制進行表示,需要先對垃圾進行編號 0~n,然后將其映射到二進制的每一位
    • 故有 vis[x][y][energy][mask] 表示到達網格 (x,y) 所剩余的能量為energy,剩余未被收集的垃圾為mask的結點狀態是否被遍歷過
    • 時間復雜度為 vis 的狀態個數 O(n*m*energy*2^k),其中 k 為垃圾的個數

代碼如下

// C++
class Solution {static constexpr int dirs[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
public:int minMoves(vector<string>& classroom, int energy) {int n = classroom.size(), m = classroom[0].size();map<pair<int,int>, int> mp;int start_x = 0, start_y = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(classroom[i][j] == 'S'){start_x = i, start_y = j;}else if(classroom[i][j] == 'L'){mp[{i, j}] = mp.size();}}}vector vis(n, vector(m, vector(energy + 1, vector<bool>(1 << mp.size()))));int step = 0;queue<tuple<int,int,int,int>> q;q.emplace(start_x, start_y, energy, (1 << mp.size()) - 1);vis[start_x][start_y][energy][(1 << mp.size()) - 1] = true;while(q.size()){int sz = q.size();while(sz--){auto [x, y, e, mask] = q.front(); q.pop();if(mask == 0){ // 垃圾全部收集完return step;}for(int i = 0; i < 4; i++){int nx = x + dirs[i][0], ny = y + dirs[i][1];if(nx < 0 || nx >= n || ny < 0 || ny >= m || classroom[nx][ny] == 'X' || e == 0) // 如果越界、是障礙物、沒有能量,則不能走continue;int new_e = classroom[nx][ny] == 'R' ? energy : e - 1;int new_mask = classroom[nx][ny] == 'L' ? (mask & ~(1 << mp[{nx, ny}])) : mask;if(!vis[nx][ny][new_e][new_mask]){q.emplace(nx, ny, new_e, new_mask);vis[nx][ny][new_e][new_mask] = true;}}}step++;}return -1;}
};

四、分割數組后不同質數的最大數目

在這里插入圖片描述
nums 數組分為前綴 A 和 后綴 B,求 max(A中不同質數個數 + B中不同質數個數),該問題可以轉換成 nums 中不同質數個數 + 哪些質數能被計算兩次。

  • nums 中不同質數的個數,我們可以直接用哈希表計算處理

    • 前置問題:如何快速判斷一個數字是否是質數,我們可以用埃氏篩進行預處理,具體見代碼
  • 哪些質數能被計算兩遍?對于一個質數 x,我們只需要知道它出現的最左下標 l 和最右下標 r,只要 k 在 (l,r] 中,那么 x 對答案的貢獻就能 +1,而這就是 區間 +1 操作,然后我們只要找出區間的 +1 次數最多的位置即可,即 維護區間最大值

    • 區間+1維護區間最大值,可以用線段樹來維護

    • 同時,由于會不斷的跟新數組中的數組,質數的下標位置信息也會變化,故我們需要用 set 維護質數的下標信息

      • 在通過質數下標數據對線段樹進行跟新時,為了簡化跟新判斷邏輯,我們可以先對原本的操作進行撤銷,然后再進行跟新操作即可

代碼如下

//C++
#include <ranges>
const int MX = 1e5 + 5;
vector<bool> is_prime(MX, true);
int init = []{ // 預處理出所有的質數is_prime[0] = is_prime[1] = false;for(int i = 2; i < MX; i++){if(is_prime[i]){for(int j = 2*i; j < MX; j += i){is_prime[j] = false;}}}return 0;
}();
//   要求 質數的數量之和最大
//   轉換成 總的不同質數個數 + 哪些質數能被計算兩遍
//   對于任意一個質數來說,只要劃分區間的點 k 在 (left, right] 之間,答案就能 +1
//=> 區間+1/-1問題 + 求區間最值問題,可以用 線段樹 來維護
class SegTree{
public:SegTree(int n):t(n<<2), todo(n<<2){}SegTree(const vector<int>& a){int n = a.size();t.resize(n << 2);todo.resize(n << 2);build(a, 1, 0, n - 1);}void maintain(int o){t[o] = max(t[o << 1], t[o << 1 | 1]);}void build(const vector<int>& a, int o, int l, int r){if(l == r){t[o] = a[l];return;}int m = l + (r - l)/2;build(a, o << 1, l, m);build(a, o << 1 | 1, m + 1, r);maintain(o);}void do_(int o, int l, int r, int add){todo[o] += add;t[o] += add;}void down(int o, int l, int r){if(todo[o]){ // 判斷是否有需要跟新的數據沒有下放給子節點int m = l + (r - l)/2;do_(o << 1, l, m, todo[o]);do_(o << 1|1, m + 1, r, todo[o]);todo[o] = 0;}}void update(int o, int l, int r, int L, int R, int add){if(L <= l && r <= R){ // 到達該結點時,子節點的數據可以暫且不用更新,數據保存在 todo 數組中即可(懶更新)do_(o, l, r, add);return;}down(o, l, r); // 將 懶處理的數據 下發到子節點int m = l + (r - l)/2;if(m >= L) update(o << 1, l, m, L, R, add);if(m < R) update(o << 1|1, m + 1, r, L, R, add);maintain(o);}int query(){ // 由于本題只要求整個區間的最大值,所以直接返回根節點即可return t[1];}private:vector<int> t, todo;
};class Solution {
public:vector<int> maximumCount(vector<int>& nums, vector<vector<int>>& qs) {unordered_map<int,set<int>> pos;int n = nums.size();for(auto&& [idx, val] : nums | ranges::views::enumerate){ // 同時遍歷下標和元素if(is_prime[val]){pos[val].insert(idx);}}SegTree t(n);for(auto [_, st] : pos){if(st.size() > 1){t.update(1, 0, n - 1, *st.begin() + 1, *st.rbegin(), 1);}}vector<int> ans(qs.size());for(auto&& [i, q] : qs | ranges::views::enumerate){ // 同時遍歷下標和元素int j = q[0], val = q[1];if(is_prime[nums[j]]){auto & st = pos[nums[j]];if(st.size() > 1){ // 撤銷原本的區間 +1 操作t.update(1, 0, n - 1, *st.begin() + 1, *st.rbegin(), -1);}st.erase(j);if(st.size() > 1){ // 跟新現在的區間 +1 操作t.update(1, 0, n - 1, *st.begin() + 1, *st.rbegin(), 1);}if(st.empty()){ // 維護 總的不同質數個數pos.erase(nums[j]);}}if(is_prime[val]){auto& st = pos[val];if(st.size() > 1){ // 撤銷原本的區間 +1 操作t.update(1, 0, n - 1, *st.begin() + 1, *st.rbegin(), -1);}st.insert(j);if(st.size() > 1){ // 跟新現在的區間 +1 操作t.update(1, 0, n - 1, *st.begin() + 1, *st.rbegin(), 1);}nums[j] = val; // 注意跟新數組數據}ans[i] = t.query() + pos.size(); // 答案為 能被計算兩次的質數 +  總的不同質數個數}return ans;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84366.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Python提取照片元數據:方法與實戰指南

## 引言&#xff1a;元數據的重要性 照片元數據&#xff08;Metadata&#xff09;是嵌入在圖像文件中的隱藏信息&#xff0c;記錄了拍攝設備、時間、地理位置、光圈快門參數等關鍵數據。這些信息廣泛應用于**數字取證**、**照片管理**、**地理標記分析**和**版權驗證**等場景。…

使用docker在3臺服務器上搭建基于redis 6.x的一主兩從三臺均是哨兵模式

一、環境及版本說明 如果服務器已經安裝了docker,則忽略此步驟,如果沒有安裝,則可以按照一下方式安裝: 1. 在線安裝(有互聯網環境): 請看我這篇文章 傳送陣>> 點我查看 2. 離線安裝(內網環境):請看我這篇文章 傳送陣>> 點我查看 說明&#xff1a;假設每臺服務器已…

阿里云ACP云計算備考筆記 (5)——彈性伸縮

目錄 第一章 概述 第二章 彈性伸縮簡介 1、彈性伸縮 2、垂直伸縮 3、優勢 4、應用場景 ① 無規律的業務量波動 ② 有規律的業務量波動 ③ 無明顯業務量波動 ④ 混合型業務 ⑤ 消息通知 ⑥ 生命周期掛鉤 ⑦ 自定義方式 ⑧ 滾的升級 5、使用限制 第三章 主要定義 …

CANopen轉Modbus TCP轉換器助生產線智能化升級

在自動化工業控制領域&#xff0c;CANopen和Modbus TCP是兩種廣泛采用的通信協議。它們各自具有獨特的特點和優勢&#xff0c;但在某些應用場景中&#xff0c;需要設備能夠同時支持這兩種通信標準。這就需要一個能夠實現開疆智能CANopen轉Modbus TCP轉換的網關KJ-TCPC-CANP設備…

C++圖書管理

圖書館的書籍分類系統使用二進制標簽管理&#xff0c;0 代表兒童讀物&#xff0c;1 代表青少年書籍。管理員發現當前的書架排列中不允許出現青少年書籍之后連接兒童讀物的情況&#xff08;即 10 子串&#xff09;。管理員每次可以交換任意兩本書的位置。請計算讓書架符合規定所…

汽車免拆診斷案例 | 2010款捷豹XFL車制動警告燈、DSC警告燈異常點亮

故障現象  一輛2010款捷豹XFL車&#xff0c;搭載3.0 L發動機&#xff0c;累計行駛里程約為35萬km。車主反映&#xff0c;該車組合儀表上的制動警告燈、動態穩定控制系統&#xff08;DSC&#xff09;警告燈異常點亮&#xff08;圖1&#xff09;&#xff0c;且提示“DSC NOT AV…

el-upload組件,上傳文件失敗,:on-error方法失效

el-upload組件方法失效 問題原因解決 問題 使用el-upload組件上傳文件&#xff0c;有這么一個問題上傳文件處理報錯Excel、Word。org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException。 按上述&#xff0c;后端編寫完代碼&#xff0c;輸出正常&#xff0c;但…

可視化圖解算法50:最小的K個數

牛客網 面試筆試 TOP101 | LeetCode 面試題 17.14. 最小K個數 1. 題目 描述 給定一個長度為 n 的可能有重復值的數組&#xff0c;找出其中不去重的最小的 k 個數。例如數組元素是4,5,1,6,2,7,3,8這8個數字&#xff0c;則最小的4個數字是1,2,3,4(任意順序皆可)。 數…

Ragflow配置注意項

在 .env文件中啟用v.0.19.0版本&#xff0c;帶emabedding models RAGFLOW_IMAGEinfiniflow/ragflow:v0.19.0 RAGFlow image tagImage size (GB)Has embedding models?Stable?v0.19.0≈9??Stable releasev0.19.0-slim≈2?Stable releasenightly≈9??Unstable nightly b…

Word VBA快速制作填空題

實例需求&#xff1a;Word文檔用于英語單詞學習&#xff0c;重點記憶單詞標記下劃線&#xff0c;其內容如下圖所示。 現在文檔轉換為填空題&#xff08;無論單詞字符多少&#xff0c;填空部分統一使用10個空格&#xff09;和參考答案兩部分&#xff0c;如下圖所示。 示例代碼如…

不變性(Immutability)模式

1. 不變性&#xff08;Immutability&#xff09;模式 1.1. 不變性模式的概念 定義&#xff1a;對象一旦被創建&#xff0c;其內部狀態就不再發生變化&#xff0c;也即“只讀無寫”&#xff0c;不會出現并發寫的問題&#xff0c;自然線程安全。 適用場景&#xff1a;只讀共享…

探秘鴻蒙 HarmonyOS NEXT:鴻蒙定時器,簡單倒計時的場景應用

在鴻蒙 ArkTS 開發中&#xff0c;定時器是實現動態效果和定時任務的重要工具。基于鴻蒙 API 12 及以上版本&#xff0c;ArkTS 提供了功能豐富的定時器 API&#xff0c;本文將帶你全面了解定時器的使用方法。 一、定時器常用 API 介紹 ArkTS 中的定時器主要分為一次性定時器&a…

安卓基礎(語義樹)

進化1 package com.example.demotest.unread;import android.accessibilityservice.AccessibilityService; import android.content.res.Resources; import android.graphics.Rect; import android.util.DisplayMetrics; import android.util.Log; import android.view.access…

Linux基礎開發工具——vim工具

文章目錄 vim工具什么是vimvim的多模式和使用vim的基礎模式vim的三種基礎模式三種模式的初步了解 常用模式的詳細講解插入模式命令模式模式轉化光標的移動文本的編輯 底行模式替換模式視圖模式總結 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是繼續講解Linux系統下的…

C++_核心編程_多態案例二-制作飲品

#include <iostream> #include <string> using namespace std;/*制作飲品的大致流程為&#xff1a;煮水 - 沖泡 - 倒入杯中 - 加入輔料 利用多態技術實現本案例&#xff0c;提供抽象制作飲品基類&#xff0c;提供子類制作咖啡和茶葉*//*基類*/ class AbstractDr…

AcWing--數據結構1

用數組來模擬鏈表。這種實現鏈表的方式也叫靜態鏈表。 1.單鏈表 寫鄰接表&#xff1a;存儲圖和樹 我們定義&#xff1a;e[N]用來表示某個點的值是多少&#xff1b;ne[N]用來表示某個點的next指針是多少 e和ne是用下標關聯起來的 如&#xff1a;head->3->5->7->…

云啟出海,智聯未來|阿里云網絡「企業出海」系列客戶沙龍上海站圓滿落地

借阿里云中企出海大會的東風&#xff0c;以**「云啟出海&#xff0c;智聯未來&#xff5c;打造安全可靠的出海云網絡引擎」為主題的阿里云企業出海客戶沙龍云網絡&安全專場于5.28日下午在上海順利舉辦&#xff0c;現場吸引了來自攜程、小紅書、米哈游、嗶哩嗶哩、波克城市、…

多模態分類案例實現

以下是基于飛槳平臺實現的多模態分類詳細案例&#xff0c;結合圖像和文本信息進行分類任務。案例包含數據處理、模型構建、訓練和評估的完整流程&#xff0c;并提供詳細注釋&#xff1a; 一、多模態分類案例實現 import os import json import numpy as np from PIL import I…

Express框架:Node.js的輕量級Web應用利器

Hi,我是布蘭妮甜 !在當今快速發展的Web開發領域,Node.js已成為構建高性能、可擴展網絡應用的重要基石。而在這片肥沃的生態系統中,Express框架猶如一座經久不衰的燈塔,指引著無數開發者高效構建Web應用的方向。本文章在為讀者提供一份全面而深入的Express框架指南。無論您…

K-Means顏色變卦和漸變色

一、理論深度提升&#xff1a;補充算法細節與數學基礎 1. K-Means 算法核心公式&#xff08;增強專業性&#xff09; 在 “原理步驟” 中加入數學表達式&#xff0c;說明聚類目標&#xff1a; K-Means 的目標是最小化簇內平方和&#xff08;Within-Cluster Sum of Squares, W…