給你一個整數數組 nums ,判斷這個數組中是否存在長度爲 3 的遞增子序列。
若是存在這樣的三元組下標 (i, j, k) 且知足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;不然,返回 false 。javascript
輸入:nums = [1,2,3,4,5] 輸出:true 解釋:任何 i < j < k 的三元組都知足題意
輸入:nums = [5,4,3,2,1] 輸出:false 解釋:不存在知足題意的三元組
輸入:nums = [2,1,5,0,4,6] 輸出:true 解釋:三元組 (3, 4, 5) 知足題意,由於 nums[3] == 0 < nums[4] == 4 < nums[5] == 6
1 <= nums.length <= 105 -231 <= nums[i] <= 231 - 1
進階:你能實現時間複雜度爲 O(n) ,空間複雜度爲 O(1) 的解決方案嗎?java
1.找到最小值和次小的值,經過跟當前元素進行比較;<br/>
2.更新最小值和次小值<br/>
2.不然即知足條件<br/>python
//引入math庫 import ( "math" ) func increasingTriplet(nums []int) bool { //記錄最小值和第二小的值 m1, m2 := math.MaxInt32, math.MaxInt32 for _, v := range nums { //找到子序列第一個元素,不斷更新 if m1 >= v { m1 = v } else if m2 >= v { //找到子序列第二個元素,不斷更新 m2 = v } else { //找到第三個,知足要求 return true } } return false }
/** * @param {number[]} nums * @return {boolean} */ var increasingTriplet = function (nums) { let min = nums[0], temp = Number.MAX_VALUE // 最小值,中間值 for (let i = 1; i < nums.length-1; i++) { //找到最小值 min = Math.min(min, nums[i]) //找到中間值 if (nums[i] > min) { temp = nums[i] } //找到第三個值 if (temp < nums[i + 1]) { return true } } return false };
每行中的整數從左到右按升序排列。
每行的第一個整數大於前一行的最後一個整數。
示例 1:算法
輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 輸出:true
示例 2:typescript
輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13 輸出:false
提示:數組
m == matrix.length n == matrix[i].length 1 <= m, n <= 100 -104 <= matrix[i][j], target <= 104
func searchMatrix(matrix [][]int, target int) bool { m := len(matrix) n := len(matrix[0]) var i = 0 for i < m && n > 0 { if target == matrix[i][n-1] { return true } else if target < matrix[i][n-1] { n-- } else { i++ } } return false }
/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */ var searchMatrix = function(matrix, target) { for(let i=0;i<matrix.length;i++){ for(let j=0;j<matrix[0].length;j++){ if(matrix[i][j]===target){ return true } } } return false };
/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */ /* 以二維數組左下角爲原點,創建直角座標軸。 若當前數字大於了查找數,查找往上移一位。 若當前數字小於了查找數,查找往右移一位。 */ var searchMatrix = function(matrix, target) { let x = matrix.length-1,y = 0 while(x>=0 && y<matrix[0].length){ if(matrix[x][y]===target){ return true }else if(matrix[x][y]>target){ x-- }else{ y++ } } return false };
/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */ var searchMatrix = function(matrix, target) { let m = matrix.length,n=matrix[0].length let low = 0,high = m*n-1 while(low<=high){ let mid = Math.floor((high-low)/2)+low //中位 let x = matrix[Math.floor(mid/n)][mid%n] //所在的值 if(x<target){ low = mid+1 }else if(x>target){ high = mid-1 }else{ return true } } return false };
function searchMatrix(matrix: number[][], target: number): boolean { let x: number = matrix.length - 1, y:number = 0 while (x >= 0 && y < matrix[0].length) { if (matrix[x][y] === target) { return true } else if (matrix[x][y] > target) { x-- } else { y++ } } return false };
class Solution(object): def searchMatrix(self, matrix, target): for i in range(len(matrix)): for j in range(len(matrix[0])): if matrix[i][j]==target: return True return False
def any(iterable): for element in iterable: if element: return True return False
class Solution(object): def searchMatrix(self, matrix, target): return any(target in row for row in matrix)
一般,正整數 n 的階乘是全部小於或等於 n 的正整數的乘積。例如,factorial(10) = 10 9 8 7 6 5 4 3 2 * 1。
相反,咱們設計了一個笨階乘 clumsy:在整數的遞減序列中,咱們以一個固定順序的操做符序列來依次替換原有的乘法操做符:乘法(*),除法(/),加法(+)和減法(-)。函數
例如,clumsy(10) = 10 9 / 8 + 7 - 6 5 / 4 + 3 - 2 * 1。然而,這些運算仍然使用一般的算術運算順序:咱們在任何加、減步驟以前執行全部的乘法和除法步驟,而且按從左到右處理乘法和除法步驟。spa
另外,咱們使用的除法是地板除法(floor division),因此 10 * 9 / 8 等於 11。這保證結果是一個整數。設計
實現上面定義的笨函數:給定一個整數 N,它返回 N 的笨階乘。code
輸入:4 輸出:7 解釋:7 = 4 * 3 / 2 + 1
輸入:10 輸出:12 解釋:12 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1
1 <= N <= 10000 -2^31 <= answer <= 2^31 - 1 (答案保證符合 32 位整數。
func clumsy(N int) int { if N == 1 { return 1 } else if N == 2 { return 2 } else if N == 3 { return 6 } else if N == 4 { return 7 } if N%4 == 0 { return N + 1 } else if N%4 <= 2 { return N + 2 } else { return N - 1 } }
/** * @param {number} N * @return {number} */ var clumsy = function (N) { if (N === 1) { return 1 } else if (N === 2) { return 2 } else if (N === 3) { return 6 } else if (N === 4) { return 7 } if (N % 4 === 0) { return N + 1 } else if (N % 4 <= 2) { return N + 2 } else { return N - 1 } };
class Solution(object): def clumsy(self, N): """ :type N: int :rtype: int """ if N == 1: return 1 elif N == 2: return 2 elif N == 3: return 6 elif N == 4: return 7 if N % 4 == 0: return N + 1 elif N % 4 <= 2: return N + 2 else: return N - 1
function clumsy(N: number): number { if (N === 1) { return 1 } else if (N === 2) { return 2 } else if (N === 3) { return 6 } else if (N === 4) { return 7 } if (N % 4 === 0) { return N + 1 } else if (N % 4 <= 2) { return N + 2 } else { return N - 1 } };
難度:[困難]
上面是由數組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方圖,在這種狀況下,能夠接 6 個單位的水(藍色部分表示水)。 感謝 Marcos 貢獻此圖。
輸入: [0,1,0,2,1,0,1,3,2,1,2,1] 輸出: 6
1.記錄height中的每一個元素,從左向右掃描並記錄右邊的最大高度;<br/>
2.記錄height中的每一個元素,從右向左掃描並記錄右邊的最大高度;<br/>
3.將左右位置元素對比取最小的元素,減去數組當前元素的高度。<br/>
func trap(height []int) int { n := len(height) if n == 0 { return 0 } //記錄左邊每一個元素最大高度 leftMax := make([]int, n) leftMax[0] = height[0] for i := 1; i < n; i++ { leftMax[i] = max(leftMax[i-1], height[i]) } //記錄左邊每一個元素最大高度 rightMax := make([]int, n) rightMax[n-1] = height[n-1] for i := n - 2; i >= 0; i-- { rightMax[i] = max(rightMax[i+1], height[i]) } fmt.Println(leftMax, rightMax) ret := 0 for j := 0; j < n; j++ { ret += (min(leftMax[j], rightMax[j]) - height[j]) } return ret } //因爲Go語言裏面沒有max(),min()須要本身實現一個 func max(a, b int) int { if a-b > 0 { return a } return b } func min(a, b int) int { if a-b > 0 { return b } return a }
var trap = function (height) { let len = height.length if (len === 0) return 0 //記錄左邊每一個矩形最大高度 let left = Array(len).fill(0) left[0] = height[0] for (let i = 1; i < len; ++i) { left[i] = Math.max(left[i - 1], height[i]) } //記錄右邊每一個矩形最大高度 let right = Array(len).fill(0) right[len - 1] = height[len - 1] for (let i = len - 2; i >= 0; --i) { right[i] = Math.max(right[i + 1], height[i]) } //記錄結果 let ret = 0 for (let i = 0; i < len; ++i) { //左右對比取最小邊界,減去當前矩形高度 ret += Math.min(left[i], right[i]) - height[i] } return ret };
function trap(height) { var len = height.length; if (len === 0) return 0; //記錄左邊每一個矩形最大高度 var left = Array(len); left[0] = height[0]; for (var i = 1; i < len; ++i) { left[i] = Math.max(left[i - 1], height[i]); } //記錄右邊每一個矩形最大高度 var right = Array(len); right[len - 1] = height[len - 1]; for (var i = len - 2; i >= 0; --i) { right[i] = Math.max(right[i + 1], height[i]); } //記錄結果 var ret = 0; for (var i = 0; i < len; ++i) { //左右對比取最小邊界,減去當前矩形高度 ret += Math.min(left[i], right[i]) - height[i]; } return ret; }
class Solution(object): def trap(self, height): """ :type height: List[int] :rtype: int """ if not height: return 0 # 數組長度 n = len(height) # 記錄左邊每一個矩形最大高度 left = [0]*n left[0] = height[0] for i in range(1,n): left[i] = max(left[i - 1], height[i]) # 記錄右邊每一個矩形最大高度 right = [0]*n right[n - 1] = height[n - 1] for i in range(n-2,-1,-1): right[i] = max(right[i + 1], height[i]) # 記錄結果 ret = sum(min(left[i], right[i]) - height[i] for i in range(n)) return ret
繼續加油!