递增的三元子序列
给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。
如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意
示例 2:
输入:nums = [5,4,3,2,1]
输出:false
解释:不存在满足题意的三元组
示例 3:
输入: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) 的解决方案吗?
解题思路一
1.找到最小值和次小的值,通过跟当前元素进行比较;
2.更新最小值和次小值
2.否则即满足条件
//引入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 }
Javascript
/** * @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 };
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入: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
Go 数组查找
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 }
javascript 暴力解法
/** * @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 };
javascript 数组查找
/** * @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 };