題目大意:給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。
請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。
分析:這道題我一開始以為是搜尋題,然後想了一會並沒有想出來,最後採用了轉換為1維陣列排序的方式。
其實這道題的方法還是挺巧妙的,每次二分出乙個數,判斷小於等於這個數的元素是否為k個,如果是就向右移動,如果不是則向左移動。
接下來問題就轉換為了如何查詢這個矩陣中存在多少個小於等於這個數的元素,這個問題就和我們之前在劍指offer上的題目一樣了,從左下或者右上出發,然後根據情況移動。
這裡需要注意的是,每次移動的時候需要計算這一列有多少元素小於等於k,而不是單純的count++。
class
solution
else
}return left;
}public
boolean
check
(int
matrix,
int k,
int mid,
int length,
int width)
else
}return
(k <= count);}
}
題目大意:給兩個整數陣列 a 和 b ,返回兩個陣列中公共的、長度最長的子陣列的長度。
分析:這道題我一開始使用的是暴力求解,對於b陣列的任意位置,判斷a陣列中的最長子串。經過剪枝之後也能夠ac,但是時間效率就非常差。
這道題比較簡單的做法就是採用dp。
對於任意位置dp[i][j]表示的是a[:i-1]和b[:j-1]處的最長公共子串,狀態轉移方程為:
dp[i][j] = a[i-1] == b[j-1]?dp[i-1][j-1]+1:0
,然後記錄一下最長的子串。
具體**如下:
class
solution
}return max;
}}
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...