代碼隨想錄算法訓練營二刷第一天| 704. 二分查找,27. 移除元素

代碼隨想錄算法訓練營二刷第一天| 704. 二分查找,27. 移除元素

文章目錄

    • 代碼隨想錄算法訓練營二刷第一天| 704. 二分查找,27. 移除元素
      • 一、704. 二分查找
      • 二、35.搜索插入位置
      • 三、34. 在排序數組中查找元素的第一個和最后一個位置
      • 四、69.x 的平方根
      • 五、367. 有效的完全平方數
      • 六、27. 移除元素
      • 七、26. 刪除有序數組中的重復項
      • 八、283. 移動零
      • 九、844. 比較含退格的字符串
      • 十、977.有序數組的平方

一、704. 二分查找

題目鏈接:
思路:維護好循環不變量。另外一個點注意別讓加和超出int類型的限制,可以變為加差。
解法一:左閉右閉

public int search(int[] nums, int target) {int left = 0, right = nums.length - 1, mid = 0;while (left <= right) {mid = left + ((right - left) >> 1);if (target > nums[mid]) {left = mid + 1;} else if (target < nums[mid]) {right = mid - 1;}else {return mid;}}return -1;}

解法二:左閉右開

public int search(int[] nums, int target) {int left = 0, right = nums.length, mid = 0;while (left < right) {mid = left + ((right - left) >> 1);if (target > nums[mid]) {left = mid + 1;} else if (target < nums[mid]) {right = mid;}else {return mid;}}return -1;}

二、35.搜索插入位置

題目鏈接:
思路:經典二分查找。

public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length - 1, mid = 0;while (left <= right) {mid = left + ((right - left) >> 1);if (target > nums[mid]) {left = mid + 1;} else if (target < nums[mid]) {right = mid - 1;} else {return mid;}}return left;}

三、34. 在排序數組中查找元素的第一個和最后一個位置

題目鏈接
思路:分別用二分查找查左邊界和右邊界,查找區間的左邊界,要在mid小于等于target時一直記錄從左邊逼近邊界,而右邊不做記錄,同理求右邊界也是如此。

class Solution {public int[] searchRange(int[] nums, int target) {if (nums.length == 0) {return new int[]{-1, -1};}int left = getLeftBorder(nums, target);int right = getRightBorder(nums, target);if (left == -2 || right == -2) {return new int[]{-1, -1};}if (right - left > 1) {return new int[]{left + 1, right - 1};}return new int[]{-1, -1};}int getLeftBorder(int[] nums, int target) {int left = 0, right = nums.length - 1, mid = 0, leftBorder = -2;while (left <= right) {mid = left + ((right - left) >> 1);if (target <= nums[mid]) {right = mid - 1;leftBorder = right;}else {left = mid + 1;}}return leftBorder;}int getRightBorder(int[] nums, int target) {int left = 0, right = nums.length - 1, mid = 0, rightBorder = -2;while (left <= right) {mid = left + ((right - left) >> 1);if (target >= nums[mid]) {left = mid + 1;rightBorder = left;}else {right = mid - 1;}}return rightBorder;}
}

四、69.x 的平方根

題目鏈接
思路:求平方根有小數的向下取整,這種情況下只要中值計算小于等于mid就一直搜集結果,和上面求邊界的思路類似,當然注意防止溢出,要用long

class Solution {public int mySqrt(int x) {int left = 0, right = x, result = 0;while (left <= right) {int mid = left + ((right - left) >> 1);if ((long) mid * mid <= x) {result = mid;left = mid + 1;} else {right = mid - 1;}}return result;}
}

五、367. 有效的完全平方數

題目鏈接
思路:二分查找搜索即可,但是同樣注意乘積使用long。

class Solution {public boolean isPerfectSquare(int num) {int left = 0, right = num, mid = 0;while (left <= right) {mid = left + ((right - left) >> 1);long temp = (long) mid * mid;if (temp == num) {return true;} else if (num < temp) {right = mid - 1;}else {left = mid + 1;}}return false;}
}

六、27. 移除元素

題目鏈接
思路:用一個變量k計數,記錄相等元素的個數,不等則向前移動k個位置,最后返回數組長度減去k,因為k是要刪除的元素。

class Solution {public int removeElement(int[] nums, int val) {int k = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] == val) {k++;}else {nums[i-k] = nums[i];}}return nums.length - k;}
}

雙指針解法:一個快指針,一個慢指針,快指針向前遍歷,快指針指向的元素不等于target,就將元素賦值給慢指針,慢指針再前進一步,這個思路和上面有一個變量記錄要移動的距離類似,有異曲同工之妙。

class Solution {public int removeElement(int[] nums, int val) {int slow = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != val) {nums[slow++] = nums[i];}}return slow;}
}

雙向指針法:一個關鍵點維護好循環不變量,然后從左尋找等于target的值(即要被覆蓋的值),從右尋找不等于target的值(即要保留的值),找到之后即覆蓋一次。

class Solution {public int removeElement(int[] nums, int val) {int left = 0, right = nums.length - 1;while (left <= right) {while (left <= right && nums[left] != val) {left++;}while (left <= right && nums[right] == val) {right--;}if (left <= right) {nums[left++] = nums[right--];}}return left;}
}

七、26. 刪除有序數組中的重復項

題目鏈接
思路:因為數組是有序的,所以相同的元素都是緊挨著的,只需要比較相鄰元素即可,只要當前元素與上一個元素相等就給元素k加1,當不相等時,就要往前移動k個位置,數組的長度即為刪除掉K個元素之后的長度。

class Solution {public int removeDuplicates(int[] nums) {if (nums.length == 1) return 1;int k = 0;for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i-1]) {k++;}else {nums[i-k] = nums[i];}}return nums.length - k;}
}

八、283. 移動零

題目鏈接
思路:這個移動零和前面刪除元素類似,快慢指針然后交換元素即可。

class Solution {public void moveZeroes(int[] nums) {int slow = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != 0) {int temp = nums[slow];nums[slow++] = nums[i];nums[i] = temp;}}}
}

九、844. 比較含退格的字符串

題目鏈接
思路:從前往后要拼接字符串,從后往前就簡單了,有#就記錄,沒有就跳過#數量,數量沒了就比較是否相等,不等就返回false

class Solution {public boolean backspaceCompare(String s, String t) {int i = s.length() - 1, j = t.length() - 1;int skipS = 0, skipT = 0;while (i >= 0 || j >= 0) {while (i >= 0) {if (s.charAt(i) == '#') {skipS++;i--;} else if (skipS > 0) {skipS--;i--;}else {break;}}while (j >= 0) {if (t.charAt(j) == '#') {skipT++;j--;} else if (skipT > 0) {skipT--;j--;}else {break;}}if (i >= 0 && j >= 0) {if (s.charAt(i) != t.charAt(j)) {return false;}} else {if (i >= 0 || j >= 0) {return false;}}i--;j--;}return true;}
}

十、977.有序數組的平方

題目鏈接
思路:找到正數負數分界線,然后歸并算法

class Solution {public int[] sortedSquares(int[] nums) {int n = nums.length;int negative = -1;for (int i = 0; i < n; ++i) {if (nums[i] < 0) {negative = i;} else {break;}}int[] ans = new int[n];int index = 0, i = negative, j = negative + 1;while (i >= 0 || j < n) {if (i < 0) {ans[index] = nums[j] * nums[j];++j;} else if (j == n) {ans[index] = nums[i] * nums[i];--i;} else if (nums[i] * nums[i] < nums[j] * nums[j]) {ans[index] = nums[i] * nums[i];--i;} else {ans[index] = nums[j] * nums[j];++j;}++index;}return ans;}}

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

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

相關文章

【回溯】總結

1、 組合和子集問題 組合問題需要滿足一定要求才算作一個答案&#xff0c;比如數量要求&#xff08;k個數&#xff09;&#xff0c;累加和要求&#xff08;target&#xff09;。 子集問題是只要構成一個新的子集就算作一個答案。 進階&#xff1a;去重邏輯。 一般都是要對同…

Linux 5種網絡IO模型

Linux IO模型 網絡IO的本質是socket的讀取&#xff0c;socket在linux系統被抽象為流&#xff0c;IO可以理解為對流的操作。剛才說了&#xff0c;對于一次IO訪問&#xff08;以read舉例&#xff09;&#xff0c;數據會先被拷貝到操作系統內核的緩沖區中&#xff0c;然后才會從操…

LL庫實現SPI MDA發送方式驅動WS2812

1&#xff0c;首先打卡STM32CubeMX&#xff0c;配置一下工程&#xff0c;這里使用的芯片是STM32F030F4P6。 時鐘 SPI外設 SPI DMA 下載接口&#xff0c;這個不配置待會下程序后第二次就不好下載調試了。 工程配置&#xff0c;沒啥說的 選擇生成所有文件 將驅動都改為LL庫 然后直…

OpenCV之特征點匹配

特征點選取 特征點探測方法有goodFeaturesToTrack(),cornerHarris()和SURF()。一般使用goodFeaturesToTrack()就能獲得很好的特征點。goodFeaturesToTrack()定義&#xff1a; void goodFeaturesToTrack( InputArray image, OutputArray corners,int maxCorners, double qualit…

jmeter errstr :“unsupported field type for multipart.FileHeader“

在使用jmeter測試接口的時候&#xff0c;提示errstr :"unsupported field type for multipart.FileHeader"如圖所示 這是因為我們 在HTTP信息頭管理加content-type參數有問題 直接在HTTP請求中&#xff0c;勾選&#xff1a; use multipart/form-data for POST【中文…

22、touchGFX學習Model-View-Presenter設計模式

touchGFX采用MVP架構&#xff0c;如下所示&#xff1a; 本文界面如下所示&#xff1a; 本文將實現兩個操作&#xff1a; 1、觸摸屏點擊開關按鍵實現打印開關顯示信息&#xff0c;模擬開關燈效果 2、板載案按鍵控制觸摸屏LED燈的顯示和隱藏 一、觸摸屏點擊開關按鍵實現打印開…

Go語言之依賴管理

go module go module是Go1.11版本之后官方推出的版本管理工具&#xff0c;并且從Go1.13版本開始&#xff0c;go module將是Go語言默認的依賴管理工具。 GO111MODULE 要啟用go module支持首先要設置環境變量GO111MODULE 通過它可以開啟或關閉模塊支持&#xff0c;它有三個可選…

docker搭建LNMP

docker安裝 略 下載鏡像 nginx:最新版php-fpm:根據自己需求而定mysql:根據自己需求定 以下是我搭建LNMP使用的鏡像版本 rootVM-12-16-ubuntu:/docker/lnmp/php/etc# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0…

Linux的基本權限(文件,目錄)

文章目錄 前言一、Linux權限的概念二、Linux權限管理 1.文件訪問者分類2.文件類型和訪問類型3.文件訪問權限的相關設置方法三、目錄的權限四、權限的總結 前言 Linux下一切皆文件&#xff0c;指令的本質就是可執行文件&#xff0c;直接安裝到了系統的某種路徑下 一、Linux權限的…

embed mongodb 集成spring

在property文件下添加 de.flapdoodle.mongodb.embedded.version5.0.5 spring.mongodb.embedded.storage.oplog-size0不指定數據庫&#xff0c;會使用test&#xff0c; port默認是0&#xff0c;隨機端口號。 oplog-size mac默認是192mb, 其他系統會使用5%的磁盤可用空間&#x…

SpringCloud實用篇6——elasticsearch搜索功能

目錄 1 DSL查詢文檔1.1 DSL查詢分類1.2 全文檢索查詢1.2.1 使用場景1.2.2 基本語法1.2.3 示例1.2.4 總結 1.3 精準查詢1.3.1 term查詢1.3.2 range查詢1.3.3 總結 1.4.地理坐標查詢1.4.1 矩形范圍查詢1.4.2 附近查詢 1.5 復合查詢1.5.1 相關性算分1.5.2 算分函數查詢1&#xff0…

Python 字節碼指令 LOAD_DEREF

LOAD_DEREF 是 Python 字節碼指令&#xff0c;它與閉包和嵌套函數有關。要理解 LOAD_DEREF&#xff0c;我們首先需要了解 Python 中的幾個概念&#xff1a;cell、free variable 和閉包。 Cell 和 Free Variables: 當一個嵌套函數引用了其上級作用域中的一個變量&#xff0c;但該…

【大數據Hive】hive 事務表使用詳解

目錄 一、前言 二、Hive事務背景知識 hive事務實現原理 hive事務原理之 —— delta文件夾命名格式 _orc_acid_version 說明 bucket_00000 合并器(Compactor) 二、Hive事務使用限制 參數設置 客戶端參數設置 客戶端參數設置 三、Hive事務使用操作演示 操作步驟 客…

(已解決)redis.get報錯com.alibaba.fastjson.JSONException: autoType is not support

redis存取值問題&#xff0c;存自定義實體對象&#xff1b; 第一次取的時候報錯&#xff1a;com.alibaba.fastjson.JSONException: autoType is not support。 GenericFastJsonRedisSerializer序列化和反序列化redis的value值&#xff0c;需要bean對象含有無參構造方法。 解決…

【C語言】回調函數,qsort排序函數的使用和自己實現,超詳解

文章目錄 前言一、回調函數是什么二、回調函數的使用1.使用標準庫中的qsort函數2.利用qsort函數對結構體數組進行排序 三、實現qsort函數總結 先記錄一下訪問量突破2000啦&#xff0c;謝謝大家支持&#xff01;&#xff01;&#xff01; 這里是上期指針進階鏈接&#xff0c;方便…

金融術語總結

洗錢 將犯罪或其他非法違法行為所獲得的違法收入&#xff0c;通過各種手段掩飾、隱瞞、轉化&#xff0c;使其在形式上合法化的行為。 存量客戶 某個時間段里原先已有的客戶,與新增客戶相對應。 月活躍用戶數量&#xff0c;MAU&#xff08;Monthly Active User&#xff0c;M…

【go語言基礎】go中的方法

先思考一個問題&#xff0c;什么是方法&#xff0c;什么是函數&#xff1f; 方法是從屬于某個結構體或者非結構體的。在func這個關鍵字和方法名中間加了一個特殊的接收器類型&#xff0c;這個接收器可以是結構體類型的或者是非結構體類型的。從屬的結構體獲取該方法。 函數則…

【100天精通python】Day37:GUI界面編程_PyQT從入門到實戰(上)

目錄 專欄導讀 1 PyQt6 簡介&#xff1a; 1.1 安裝 PyQt6 和相關工具&#xff1a; 1.2 PyQt6 基礎知識&#xff1a; 1.2.1 Qt 的基本概念和組件&#xff1a; 1.2.2 創建和使用 Qt 窗口、標簽、按鈕等基本組件 1.2.3 布局管理器&#xff1a;垂直布局、水平布局、網格布局…

typedef函數代碼段解釋以及部分Windows下的系統函數

文章目錄 1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)3、typedef int (WINAPI* LPSDOLTerminal)();4、GetProcAddress運行時獲取一個動態鏈接庫&#xff08;DLL&#xff09;中…

mysql與redis區別

mysql和redis的數據庫類型 mysql是關系型數據庫&#xff0c;主要用于存放持久化數據&#xff0c;將數據存儲在硬盤中&#xff0c;讀取速度較慢。 redis是NOSQL&#xff0c;即非關系型數據庫&#xff0c;也是緩存數據庫&#xff0c;即將數據存儲在緩存中&#xff0c;緩存的讀取速…