給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。若是目標值不存在於數組中,返回它將會被按順序插入的位置。git
你能夠假設數組中無重複元素。數組
示例 1:輸入: [1,3,5,6], 5
輸出: 2
示例 2:函數輸入: [1,3,5,6], 2
輸出: 1
示例 3:編碼輸入: [1,3,5,6], 7
輸出: 4
示例 4:spa輸入: [1,3,5,6], 0
輸出: 0prototype
解一:3d
仍是indexOf開頭,若是存在返回索引值,不然就push一下給它生米煮成熟飯,再排序,從新返回索引值。指針
解二:code
老實方法用for遍歷,存在(=)和不存在(>)兩種狀況能夠一塊兒處理。blog
解三:
使用二分法,也是這道題真正想考察的方法。
二分法理解起來很簡單,小學就學過。可是實際編碼時,邊界防範、左右中位數的取捨、while中的條件以及是否+1何處+1能夠說是要到處設防。
「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。前五項以下:
- 1
- 11
- 21
- 1211
- 111221
1 被讀做 "one 1" ("一個一") , 即 11。
11 被讀做 "two 1s" ("兩個一"), 即 21。
21 被讀做 "one 2", "one 1" ("一個二" , "一個一") , 即 1211。
給定一個正整數 n(1 ≤ n ≤ 30),輸出外觀數列的第 n 項。
注意:整數序列中的每一項將表示爲一個字符串。
示例 1:輸入: 1
輸出: "1"
解釋:這是一個基本樣例。
示例 2:輸入: 4
輸出: "1211"
解釋:當 n = 3 時,序列是 "21",其中咱們有 "2" 和 "1" 兩組,"2" 能夠讀做 "12",也就是出現頻次 = 1 而 值 = 2;相似 "1" 能夠讀做 "11"。因此答案是 "12" 和 "11" 組合在一塊兒,也就是 "1211"。
解一:
經過正則合併相同元素完成累加
解二:
這種類型的題目用字典不是特別爽嗎?
給定一個整數數組 nums ,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
進階:
若是你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。
解題思路:
示例: [a, b , c, d , e]
解答這類題目, 省略不掉遍歷, 所以咱們先從遍歷方式提及
一般咱們遍歷子串或者子序列有三種遍歷方式
以某個節點爲開頭的全部子序列: 如 [a],[a, b],[ a, b, c] ... 再從以 b 爲開頭的子序列開始遍歷 [b] [b, c]。
根據子序列的長度爲標杆,如先遍歷出子序列長度爲 1 的子序列,在遍歷出長度爲 2 的 等等。
以子序列的結束節點爲基準,先遍歷出以某個節點爲結束的全部子序列,由於每一個節點均可能會是子序列的結束節點,所以要遍歷下整個序列,如: 以 b 爲結束點的全部子序列: [a , b] [b] 以 c 爲結束點的全部子序列: [a, b, c] [b, c] [ c ]。
第一種遍歷方式一般用於暴力解法, 第二種遍歷方式 leetcode (5. 最長迴文子串 ) 中的解法就用到了。
第三種遍歷方式 由於能夠產生遞推關係, 採用動態規劃時, 常常經過此種遍歷方式, 如 揹包問題, 最大公共子串 , 這裏的動態規劃解法也是以 先遍歷出 以某個節點爲結束節點的全部子序列 的思路
對於剛接觸動態規劃的, 我感受熟悉第三種遍歷方式是須要抓住的核心
由於咱們一般的慣性思惟是以子序列的開頭爲基準,先遍歷出以 a 爲開頭的全部子序列,再遍歷出以 b 爲開頭的...可是動態規劃爲了找到不一樣子序列之間的遞推關係,偏偏是以子序列的結束點爲基準的,這點開闊了咱們的思路。
我在網上看很多解答時,直接閱讀其代碼,老是感受很理解很吃力,由於好多沒有寫清楚,一些遍歷到底表明什麼意思,看了許久仍不知因此然,下面的代碼中摘錄了 維基中的解釋,感受比較清楚,供你們理解參考。
代碼:
第二塊代碼和 第一塊代碼 思路實現是徹底同樣的,可是若是第一次看到這類題目,直接閱讀 第二塊代碼,理解起來很難,尤爲是 若是改爲 if (sum > 0 ) 對於剛接觸的這題目的比較很差理解。
給定一個僅包含大小寫字母和空格 ' ' 的字符串 s,返回其最後一個單詞的長度。若是字符串從左向右滾動顯示,那麼最後一個單詞就是最後出現的單詞。
若是不存在最後一個單詞,請返回 0 。
說明:一個單詞是指僅由字母組成、不包含任何空格字符的 最大子字符串。
示例:輸入: "Hello World"
輸出: 5
解一:使用trim
解法二:遍歷
從右往左最後一個字符位置開始,求最後一個單詞的開頭和結尾字符索引位置,相減即爲所求
結尾字符記錄索引爲end,初始化爲字符串結尾字符索引
遇到空字符,end--
不然
end < 0,越界,字符串爲空或不存在,返回0
end > 0
繼續end--判斷字符串是否爲空
不爲空,則說明找到了最後一個單詞的結尾字符索引位置
開頭字符初始化爲 start = end,依舊向前遍歷
不爲空,則 end--
爲空,則說明找到了最後一個單詞的首字符位置 start
結果
end - start
給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。
最高位數字存放在數組的首位, 數組中每一個元素只存儲單個數字。
你能夠假設除了整數 0 以外,這個整數不會以零開頭。
示例 1:輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。示例 2:
輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。
解法一:使用es10 bigint
如下是相應的代碼實現:
方法二: 小學生加法
咱們將問題簡化爲第i位(0 <= i < n)加一或加0。
而加一的結果分爲兩種狀況:
加一後須要進位
加一後不須要進位
對於第二種狀況,咱們直接返回digits就能夠。
對於第一種狀況,咱們將指針移到前面一位。繼續一樣處理。
而邊界狀況即,首位也產生進位,首位產生進位只會是999....9999這種狀況,咱們也很容易得出結果。
給你兩個二進制字符串,返回它們的和(用二進制表示)。
輸入爲 非空 字符串且只包含數字 1 和 0。
示例 1:輸入: a = "11", b = "1"
輸出: "100"
示例 2:輸入: a = "1010", b = "1011"
輸出: "10101"
提示:
每一個字符串僅由字符 '0' 或 '1' 組成。
1 <= a.length, b.length <= 10^4
字符串若是不是 "0" ,就都不含前導零。
解法一:利用BigInt解決溢出的問題
解法二:小學生加法
實現 int sqrt(int x) 函數。
計算並返回 x 的平方根,其中 x 是非負整數。
因爲返回類型是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:輸入: 4
輸出: 2
示例 2:輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842...,
因爲返回類型是整數,小數部分將被捨去。
解一:
現成的sqrt函數來一個。
解二:
最耿直的自增暴力解。
解三:
牛頓法,只用知道迭代公式就行了(原理在數學規劃課上學得差很少了):
假設你正在爬樓梯。須要 n 階你才能到達樓頂。
每次你能夠爬 1 或 2 個臺階。你有多少種不一樣的方法能夠爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2
輸出: 2
解釋: 有兩種方法能夠爬到樓頂。
- 1 階 + 1 階
- 2 階
示例 2:
輸入: 3
輸出: 3
解釋: 有三種方法能夠爬到樓頂。
- 1 階 + 1 階 + 1 階
- 1 階 + 2 階
- 2 階 + 1 階
解法:動態規劃
本問題其實常規解法能夠分紅多個子問題,爬第n階樓梯的方法數量,等於 2 部分之和
爬上 n-1n−1 階樓梯的方法數量。由於再爬1階就能到第n階
爬上 n-2n−2 階樓梯的方法數量,由於再爬2階就能到第n階
因此咱們獲得公式 dp[n] = dp[n-1] + dp[n-2]dp[n]=dp[n−1]+dp[n−2]
同時須要初始化 dp[0]=1dp[0]=1 和 dp[1]=1dp[1]=1
時間複雜度:O(n)O(n)
給定一個排序鏈表,刪除全部重複的元素,使得每一個元素只出現一次。
示例 1:
輸入: 1->1->2
輸出: 1->2
示例 2:輸入: 1->1->2->3->3
輸出: 1->2->3
思路
標籤:鏈表
指定 cur 指針指向頭部 head
當 cur 和 cur.next 的存在爲循環結束條件,當兩者有一個不存在時說明鏈表沒有去重複的必要了
當 cur.val 和 cur.next.val 相等時說明須要去重,則將 cur 的下一個指針指向下一個的下一個,這樣就能達到去重複的效果
若是不相等則 cur 移動到下一個位置繼續循環
時間複雜度:O(n)O(n)
給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成爲一個有序數組。
說明:
初始化 nums1 和 nums2 的元素數量分別爲 m 和 n 。
你能夠假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來保存 nums2 中的元素。
示例:輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3輸出: [1,2,2,3,5,6]
解一:
數組拼接後sort排序。缺點是沒有利用nums1和nums2自己是有序數組的優點。
解法二:雙指針 + 從後向前
思路
兩個數組從小到大排序
且題目要求 修改nums1爲合併排好序的nums1+nums2
雙指針
兩個分別指向兩個數組尾部的指針
從後向前
比較兩指針位置的值
大的必定是結果數組的最大值
一一填充到 nums1的末尾
遍歷完後
當 n > 0 時
說明 nums2 中還有剩餘沒有比較的數字
將其插入替換 nums1 數組前面n個數字便可