文章目錄
- 189. 輪轉數組
- 122. 買賣股票的最佳時機 II
- 55. 跳躍游戲
- 45. 跳躍游戲 II
- 274. H 指數
🌈你好呀!我是 山頂風景獨好
💝歡迎來到我的博客,很高興能夠在這里和您見面!
💝希望您在這里可以感受到一份輕松愉快的氛圍!
💝不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。
🚀 歡迎一起踏上探險之旅,挖掘無限可能,共同成長!
189. 輪轉數組
給定一個整數數組 nums,將數組中的元素向右輪轉 k 個位置,其中 k 是非負數。
思路如下:
- 首先對整個數組實行翻轉,這樣子原數組中需要翻轉的子數組,就會跑到數組最前面。
- 這時候,從 kkk 處分隔數組,左右兩數組,各自進行翻轉即可。
class Solution { // 旋轉數組的方法 public void rotate(int[] nums, int k) { // 如果k大于數組長度,則通過取模操作減少k的值,因為輪轉長度超過數組長度是無效的 k %= nums.length; // 首先將整個數組反轉 reverse(nums, 0, nums.length - 1); // 然后將前k個元素反轉,得到原本的后k個元素在正確位置上的結果 reverse(nums, 0, k - 1); // 最后將剩下的元素(即原數組中的前n-k個元素)反轉,得到最終的輪轉結果 reverse(nums, k, nums.length - 1); } // 反轉數組指定區間內元素的方法 // 參數start表示區間的起始索引,end表示區間的結束索引(不包含end) public void reverse(int[] nums, int start, int end) { // 當起始索引小于結束索引時,進行反轉操作 while (start < end) { // 交換start和end索引處的元素 int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; // 起始索引和結束索引分別向中間移動 start += 1; end -= 1; } }
}
122. 買賣股票的最佳時機 II
- 給你一個整數數組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。
- 在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。
- 返回 你能獲得的 最大 利潤 。
思路如下:
該問題的核心是在給定的股票價格數組中,找出可以執行多次買賣操作(即同一天內可以買入并賣出)以獲得最大利潤的方式。由于可以多次買賣,所以只要股票的價格在連續兩天中是上漲的,就可以在第一天買入并在第二天賣出以獲取利潤。
class Solution { public int maxProfit(int[] prices) { // 初始化最大利潤為0 int res = 0; // 遍歷價格數組,從索引1開始(因為我們需要比較當前價格與前一天的價格) for (int i = 1; i < prices.length; i++) { // 如果當前價格比前一天的價格高,說明我們可以買入前一天的價格并在今天賣出以獲取利潤 if (prices[i] - prices[i - 1] > 0) { // 將這個利潤累加到最大利潤中 res += prices[i] - prices[i - 1]; } } // 返回最大利潤 return res; }
}
55. 跳躍游戲
- 給你一個非負整數數組 nums ,你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。
- 判斷你是否能夠到達最后一個下標,如果可以,返回 true ;否則,返回 false 。
class Solution { public static boolean canJump(int[] nums) { // 初始化一個變量k,用于表示當前能夠到達的最遠位置 int k = 0; // 遍歷數組中的每一個元素 for (int i = 0; i < nums.length; i++) { // 如果當前位置i已經超過了能夠到達的最遠位置k,那么就無法繼續跳躍,返回false if (i > k) return false; // 更新能夠到達的最遠位置k,取當前能夠到達的最遠位置k和當前位置i加上當前位置能夠跳躍的最大長度nums[i]的較大值 k = Math.max(k, i + nums[i]); // 如果在遍歷過程中,k能夠到達或超過數組的最后一個位置,那么說明能夠到達最后一個位置,但此處不需要立即返回true // 因為我們需要遍歷完整個數組,以確保沒有其他位置無法到達 } // 如果遍歷完整個數組都沒有返回false,那么說明能夠到達最后一個位置,返回true return true; }
}
45. 跳躍游戲 II
- 給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。
- 每個元素 nums[i] 表示從索引 i 向前跳轉的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉到任意 nums[i + j] 處:
- 0 <= j <= nums[i]
- i + j < n
- 返回到達 nums[n - 1] 的最小跳躍次數。生成的測試用例可以到達 nums[n - 1]。
class Solution { public int jump(int[] nums) { // 獲取數組的長度 int length = nums.length; // end表示當前步跳躍可以到達的最遠位置 int end = 0; // maxPosition表示從當前位置起跳能夠到達的最遠位置 int maxPosition = 0; // steps記錄跳躍的次數 int steps = 0; // 遍歷數組,除了最后一個位置(因為最后一個位置不需要跳躍到達) for (int i = 0; i < length - 1; i++) { // 更新從當前位置起跳能夠到達的最遠位置 maxPosition = Math.max(maxPosition, i + nums[i]); // 如果當前位置i是當前步跳躍可以到達的最遠位置 if (i == end) { // 更新當前步跳躍可以到達的最遠位置為maxPosition end = maxPosition; // 跳躍次數加1 steps++; } } // 當遍歷完數組后,steps就是到達數組最后一個位置所需的最少跳躍次數 return steps; }
}
274. H 指數
- 給你一個整數數組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。計算并返回該研究者的 h 指數。
- 根據維基百科上 h 指數的定義:h 代表“高引用次數” ,一名科研人員的 h 指數 是指他(她)至少發表了 h 篇論文,并且 至少 有 h 篇論文被引用次數大于等于 h 。如果 h 有多種可能的值,h 指數 是其中最大的那個。
示例 1:
- 輸入:citations = [3,0,6,1,5]
- 輸出:3
- 解釋:給定數組表示研究者總共有 5 篇論文,每篇論文相應的被引用了 3, 0, 6, 1, 5 次。
由于研究者有 3 篇論文每篇 至少 被引用了 3 次,其余兩篇論文每篇被引用 不多于 3 次,所以她的 h 指數是 3。
示例 2:
- 輸入:citations = [1,3,1]
- 輸出:1
class Solution { public int hIndex(int[] citations) { // 初始化左右指針,左指針指向數組開始,右指針指向數組末尾的下一個位置(因為數組索引是從0開始的) int left = 0, right = citations.length; // mid 用于存儲二分查找的中間索引 int mid = 0, cnt = 0; // 當左指針小于右指針時,進行二分查找 while (left < right) { // 計算中間索引,注意這里使用 (left + right + 1) >> 1 而不是 (left + right) / 2 // 這樣做是為了在 right - left 為奇數時,mid 偏向右側,防止在 left 和 right 相鄰時陷入死循環 mid = (left + right + 1) >> 1; cnt = 0; // 重置計數,用于統計被引用次數大于等于 mid 的論文數量 // 遍歷數組,統計被引用次數大于等于 mid 的論文數量 for (int i = 0; i < citations.length; i++) { if (citations[i] >= mid) { cnt++; } } // 如果被引用次數大于等于 mid 的論文數量大于等于 mid,則 h 指數至少為 mid // 更新 left 指針為 mid,繼續在 [mid, right) 范圍內查找可能的更大的 h 指數 if (cnt >= mid) { left = mid; // 否則,h 指數一定小于 mid,更新 right 指針為 mid - 1,繼續在 [left, mid - 1] 范圍內查找 } else { right = mid - 1; } } // 循環結束后,left 和 right 指針重合,left(或 right)就是要求的 h 指數 return left; }
}