每日算法-250408

記錄今天解決的兩道 LeetCode 算法題,主要涉及二分查找的應用。


1283. 使結果不超過閾值的最小除數

題目描述

Problem Description for 1283

思路

核心思路是 二分查找

解題過程

  1. 為什么可以使用二分?
    關鍵在于單調性。對于一個固定的數組 nums,當除數 divisor 增大時,每個元素 num / divisor (向上取整) 的值是 非遞增 的,因此它們的總和也是 非遞增 的。
    我們要求的是滿足 sum <= threshold最小 divisor

    • 如果當前除數 mid 計算出的總和 sum 大于 threshold,說明 mid 太小了,我們需要增大除數。因此,真正的答案一定在 [mid + 1, right] 區間。
    • 如果當前除數 mid 計算出的總和 sum 小于等于 threshold,說明 mid 是一個可能的解,但可能存在更小的除數也滿足條件。因此,我們嘗試在 [left, mid - 1] 區間尋找更小的解,同時記錄 mid 作為潛在答案。
  2. 二分查找的目標?
    我們要查找的是滿足條件的 最小 正整數除數。

  3. 查找范圍?

    • left:最小可能的除數是 1(題目要求正整數除數)。
    • right:最大可能的除數是多少?如果除數非常大(例如,等于數組中的最大元素),那么每個數除后的結果向上取整至少是 1,總和至少是 nums.length。如果除數是數組中的最大值 max(nums),那么每個 ceil(num / max(nums)) 都是 1,總和為 nums.length。因此,一個合理的上界是數組中的最大元素值。如果閾值 threshold 非常小(比如等于 nums.length),那么除數可能需要等于最大元素值。
  4. check 函數
    需要一個輔助函數 check(nums, divisor) 來計算在當前除數 divisor 下,數組元素的除法結果(向上取整)之和。計算 ceil(x / divisor) 可以用 (x + divisor - 1) / divisor 的整數除法實現,或者像原始代碼那樣判斷余數。

復雜度

  • 時間復雜度: O(N log M)
    • 其中 N 是數組 nums 的長度。
    • M 是二分查找的范圍上限,即 nums 中的最大元素值。
    • 每次 check 函數需要 O(N) 的時間遍歷數組。
    • 二分查找需要 O(log M) 次 check 調用。
  • 空間復雜度: O(1)
    • 我們只需要常數級別的額外空間來存儲 left, right, midsum 等變量。

Code

class Solution {public int smallestDivisor(int[] nums, int threshold) {Arrays.sort(nums);int left = 1, right = nums[nums.length - 1];while (left <= right) {int mid = left + (right - left) / 2;if (check(nums, mid) < threshold + 1) {right = mid - 1;} else {left = mid + 1;}}return left;}private int check(int[] nums, int divisor) {int sum = 0;for (int x : nums) {if (x % divisor == 0) {sum += x / divisor;} else {sum += x / divisor + 1;}}return sum;}
}

1170. 比較字符串最小字母出現頻次

題目描述

Problem Description for 1170

思路

結合 預處理二分查找

解題過程

  1. 計算頻率 f(s)
    首先,需要實現一個函數 f(s),用于計算給定字符串 s 中字典序最小的字符的出現次數。遍歷字符串,找到最小字符,并統計其出現次數。

  2. 預處理 words
    words 數組中的每個字符串 W,計算其 f(W),并將這些頻率值存儲在一個新的整數數組 wFreq 中。

  3. 排序 wFreq
    為了能夠高效地查找滿足 f(queries[i]) < f(W)W 的數量,我們將 wFreq 數組進行升序排序。

  4. 二分查找
    對于每個 queries[i]:
    a. 計算 qVal = f(queries[i])
    b. 我們需要在已排序的 wFreq 數組中找到 第一個 大于 qVal 的元素的位置 idx
    c. wFreq 數組中從 idx 到末尾的所有元素都滿足 f(W) > qVal。因此,滿足條件的 W 的數量就是 wFreq.length - idx
    d. 查找 “第一個大于 qVal 的元素” 可以通過二分查找實現。具體地,我們可以查找 第一個大于等于 qVal + 1 的元素的位置。

復雜度

  • 時間復雜度: O(Lq * N + Lw * M + M log M + N log M)
    • 其中 N 是 queries 的長度,M 是 words 的長度。
    • Lq 和 Lw 分別是 querieswords 中字符串的最大長度。
    • 計算所有 f(queries[i]) 需要 O(Lq * N)。
    • 計算所有 f(W) 需要 O(Lw * M)。
    • wFreq 排序需要 O(M log M)。
    • 對每個 query 進行二分查找需要 O(log M),總共 N 次查找為 O(N log M)。
    • 整體復雜度由這些部分相加決定。如果字符串長度較小,主要由排序和查找決定。
  • 空間復雜度: O(N + M)
    • 需要 O(N) 空間存儲 queries 的頻率結果(或者直接在結果數組中計算)。
    • 需要 O(M) 空間存儲 words 的頻率數組 wFreq
    • 排序可能需要 O(log M) 或 O(M) 的額外棧空間或臨時空間,但 O(N+M) 通常是主導。

Code

import java.util.Arrays;class Solution {public int[] numSmallerByFrequency(String[] queries, String[] words) {int n = queries.length, m = words.length;int[] qFreq = new int[n]; // 存儲 queries 的 f 值int[] wFreq = new int[m]; // 存儲 words 的 f 值int[] ans = new int[n];   // 存儲最終結果// 1. 計算 queries 中每個字符串的 f 值for (int i = 0; i < n; i++) {qFreq[i] = calculateF(queries[i]);}// 2. 計算 words 中每個字符串的 f 值for (int i = 0; i < m; i++) {wFreq[i] = calculateF(words[i]);}// 3. 對 words 的頻率數組進行排序Arrays.sort(wFreq);// 4. 對每個 query 的頻率值,在排好序的 wFreq 中進行二分查找for (int i = 0; i < n; i++) {int targetFreq = qFreq[i];// 查找第一個嚴格大于 targetFreq 的元素的位置// 等價于查找第一個大于等于 targetFreq + 1 的元素的位置int index = findFirstGreater(wFreq, targetFreq);ans[i] = m - index; // 從該位置到數組末尾的元素個數即為所求}return ans;}// 計算字符串 s 的 f(s) 值private int calculateF(String s) {if (s == null || s.isEmpty()) {return 0;}char minChar = 'z' + 1; // 初始化為一個比 'z' 大的字符int count = 0;for (char c : s.toCharArray()) {if (c < minChar) {minChar = c;count = 1; // 找到了更小的字符,重置計數} else if (c == minChar) {count++; // 遇到了相同的最小字符,增加計數}}return count;}// 在升序數組 arr 中查找第一個嚴格大于 target 的元素的索引// 如果所有元素都小于等于 target,返回 arr.lengthprivate int findFirstGreater(int[] arr, int target) {int left = 0, right = arr.length - 1;int resultIndex = arr.length; // 默認為數組長度,表示沒找到while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] > target) {// arr[mid] 比 target 大,可能是第一個,也可能前面還有resultIndex = mid; // 記錄當前這個可能的位置right = mid - 1;  // 繼續向左查找更小的索引} else {// arr[mid] 小于等于 target,需要向右查找更大的值left = mid + 1;}}return resultIndex;}
}

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

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

相關文章

MySQL的子查詢

一、前言 MySQL 子查詢是指嵌套在其他 SQL 語句&#xff08;如 SELECT、WHERE、FROM 等&#xff09;內部的查詢。用于輔助主查詢完成復雜的數據篩選或計算。 二、子查詢分類 標量子查詢 描述&#xff1a;返回 單行單列&#xff08;一個值&#xff09;&#xff0c;常用于比較運…

Linux 基礎入門操作 前言 VIM的基本操作 2

1 VIM的背景介紹 Vi 的誕生與1976年&#xff0c;Vim 的前身是 Vi&#xff08;Visual Editor&#xff09;&#xff0c;由 Bill Joy 在 BSD Unix 系統上開發&#xff0c;作為 ed&#xff08;行編輯器&#xff09;的改進版本&#xff0c;提供全屏編輯功能&#xff0c;成為 Unix/L…

Java:Set操作

目錄 Set 轉 List Set 轉 List Set<String>set new HashSet<String>(); set.add("c"); set.add("d"); set.add("a"); set.add("a");//方法一&#xff1a; List<String>list new ArrayList<String>(set);//…

算力驅動未來:從邊緣計算到高階AI的算力革命

算力驅動未來&#xff1a;從邊緣計算到高階AI的算力革命 摘要 本文深入探討了不同算力水平&#xff08;20TOPS至160TOPS&#xff09;在人工智能領域的多樣化應用場景。從邊緣計算的實時目標檢測到自動駕駛的多傳感器融合&#xff0c;從自然語言處理的大模型應用到AI for Scie…

虛擬機上安裝openEuler和openGauss數據庫

1.虛擬機版本選擇VM 16 PRO 2.openEuler版本選擇openEuler-22.03-LTS-SP4-x86_64 下載地址&#xff1a;https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP4/ISO/x86_64/openEuler-22.03-LTS-SP4-x86_64-dvd.iso 3.虛擬機安裝openEuler過程&#xff1a; 4.安裝ope…

0_Pytorch中的張量操作

[引言]張量的概念 1.基本概念 張量是一個通用的多維數組&#xff0c;可以表示標量&#xff08;0 維&#xff09;、向量&#xff08;1 維&#xff09;、矩陣&#xff08;2 維&#xff09;以及更高維度的數據。張量是 PyTorch 中的核心數據結構&#xff0c;用于表示和操作數據。…

LS-LINUX-002 簡易創建SSH

LS-LINUX-002 簡易創建SSH 1. CentOS 8 創建和配置SSH服務 1.1 安裝SSH服務 CentOS 8 默認已經安裝了OpenSSH服務。如果沒有安裝&#xff0c;可以使用以下命令安裝&#xff1a; sudo dnf install -y openssh-server1.2 啟動SSH服務 安裝完成后&#xff0c;需要啟動SSH服務…

計算機專業求職面試的常見題目分類整理

以下是計算機專業求職面試的常見題目分類整理&#xff0c;每個大類精選20道高頻問題&#xff0c;結合參考內容進行解析與擴展&#xff0c;幫助系統化備考&#xff1a; 一、數據結構與算法 解釋時間復雜度和空間復雜度 時間復雜度衡量算法執行時間隨輸入規模的增長趨勢&#xf…

腳本啟動 Java 程序

如果你想在后臺啟動一個 Java 程序&#xff0c;并在終端窗口中顯示一個自定義的名字&#xff0c;可以通過編寫一個簡單的腳本來實現。以下是一個基于 Linux/macOS 的解決方案&#xff0c;使用 Bash 腳本啟動 Java 程序&#xff0c;并在終端窗口中顯示自定義標題。 示例腳本 創建…

CentOS禁用nouveau驅動

1、驗證 nouveau 是否在運行 lsmod | grep nouveau如果命令返回結果&#xff0c;說明 nouveau 驅動正在運行。 2、編輯黑名單文件 通過編輯黑名單配置文件來禁用 nouveau 驅動&#xff0c;這樣在系統啟動時不會加載它。 vi /etc/modprobe.d/blacklist-nouveau.conf修改以下…

Linux: network: tcpdump: packets dropped by kernel

文章目錄 最近遇到一個問題原因libpcap/tcpdump 接口linux/libpcap 接口內核的處理原因可能有以下幾種:解決方法:man pcap_stats最近遇到一個問題 tcpdump命令顯示有dropped的包,而且是被內核drop的。 [root@-one-01 ~]# tcpdump -i any udp and port 8080 -v -w /root/udp…

WEB安全--提權思路

一、情形 在我們成功上傳webshell到服務器中并拿到權限時&#xff0c;發現我們的權限很低無法執行特定的命令&#xff0c;這時為了能做更多的操作&#xff0c;我們就需要提升權限。 二、方式 2.1、Windows提權 1、普通用戶執行systeminfo命令獲取服務器的基本信息&#xff0…

001 vue

https://cn.vuejs.org/ 文章目錄 v-bindv-modelv-on修飾符條件渲染/控制&#xff1a;v-if v-show列表渲染 M&#xff1a;即Model&#xff0c;模型&#xff0c;包括數據和一些基本操作 V&#xff1a;即View&#xff0c;視圖&#xff0c;頁面渲染結果 VM&#xff1a;即View-Mode…

Tomcat 負載均衡

目錄 二、Tomcat Web Server 2.1 Tomcat 部署 2.1.1 Tomcat 介紹 2.1.2 Tomcat 安裝 2.2 Tomcat 服務管理 2.2.1 Tomcat 啟停 2.2.2 目錄說明 2.2.3編輯主頁 2.3 Tomcat管理控制臺 2.3.1開啟遠程管理 2.3.2 配置遠程管理密碼 三、負載均衡 3.1 重新編譯Nginx 3.1.1 確…

使用SpringSecurity下,發生重定向異常

使用SpringSecurity下&#xff0c;發生空轉異常 環境信息&#xff1a; Spring Boot 3.4.4 &#xff0c; jdk 17 &#xff0c; springSecurity 6.4.4 問題背景&#xff1a; 沒有自定義controller &#xff0c;改寫了login 頁面&#xff0c;并且進行了成功后的跳轉處理&#xf…

S130N-ISI 全棧方案與云平臺深度協同:重構 PLC 開發新范式

一、什么是 PLC&#xff1f; 1.技術定義 PLC&#xff08;Power Line Communication&#xff09;是一種創新的通信技術&#xff0c;它以電力線作為天然的傳輸介質&#xff0c;通過先進的信號調制技術將高頻數據信號疊加于工頻電流之上&#xff0c;實現電力輸送與數據通信的雙頻共…

SU-YOLO:基于脈沖神經網絡的高效水下目標檢測模型解析

論文地址:https://arxiv.org/pdf/2503.24389 目錄 一、論文概述 二、創新點解析 1. 基于脈沖的水下圖像去噪(SpikeDenoiser) 原理與結構 2. 分離批歸一化(SeBN) 原理與結構 3. 優化的殘差塊(SU-Block) 原理與結構 三、代碼復現指南 環境配置 模型訓練 四、…

實現阿里云服務器上的文字聊天程序以及C語言寫的進程間通信(IPC)程序

實現阿里云服務器上的文字聊天程序以及C語言寫的進程間通信&#xff08;IPC&#xff09;程序 1. 基于 Linux 中的管道進行進程間通信 我們首先使用管道進行進程間通信&#xff0c;這對于簡單的聊天程序來說是一個比較簡單且實用的方法。 步驟&#xff1a; 創建管道&#xf…

COMSOL 與人工智能融合的多物理場應用:28個案例的思路、方法與工具概述

應用案例概述 基于 COMSOL 與人工智能&#xff08;AI&#xff09;結合的應用案例涵蓋了 28 個多領域場景&#xff0c;包括工程&#xff08;如熱傳導優化、結構力學預測&#xff09;、能源&#xff08;如電池熱管理、燃料電池性能&#xff09;、生物醫學&#xff08;如藥物傳遞…

SAN及其ZONE

目錄 一、什么是SAN? 二、什么是ZONE? 三、配置ZONE 2.1 核心概念 2.2 劃分原則 2.3 Zone劃分最佳實踐 2.4 配置語法 1). 基于端口&#xff08;Domain,Port&#xff09;的zone語法 2). 基于WWN&#xff08;World Wide Name&#xff09;的Zone語法 3). 使用Alias簡化配置 4).…