摘要:題目假設(shè)有一個(gè)無序的數(shù)組,如果數(shù)組中從左到右存在三個(gè)由小到大的數(shù)字,則返回。這個(gè)思路實(shí)在是非常的獨(dú)特,而且精煉這里它用兩個(gè)變量分別記錄了已經(jīng)遍歷過的數(shù)字中最小的數(shù)字和第二小的數(shù)字,一旦找到比這兩個(gè)數(shù)字都大的數(shù)字就證明一定存在一個(gè)升序。
題目
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array. Formally the function should: Return true if there exists i, j, k such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false. Note: Your algorithm should run in O(n) time complexity and O(1) space complexity. Example 1: Input: [1,2,3,4,5] Output: true Example 2: Input: [5,4,3,2,1] Output: false
假設(shè)有一個(gè)無序的數(shù)組,如果數(shù)組中從左到右存在三個(gè)由小到大的數(shù)字,則返回true。否則返回false。
題目的額外要求是:O(n)的時(shí)間復(fù)雜度和O(1)的空間復(fù)雜度
思路一: 找到中間位置其實(shí)我們知道只要找到這樣一個(gè)數(shù)字,該數(shù)字左邊存在比它小的數(shù)字,右邊存在比它大的數(shù)字,就可以確信該數(shù)字一定屬于某個(gè)上升序列的中間數(shù)字。所我們可以先從左往右得出每一個(gè)數(shù)字左邊是否有比它小的數(shù)字,再從有望走得出右邊是否有比它大的數(shù)字,最后再根據(jù)這兩個(gè)信息判斷該數(shù)字是否為上升序列的中間數(shù)字。
public boolean increasingTriplet(int[] nums) { if(nums == null || nums.length < 3) return false; boolean[] hasLeftMin = new boolean[nums.length]; boolean[] hasRightMax = new boolean[nums.length]; int left = 0; int right = nums.length - 1; for(int i = 1 ; inums[left]) { hasLeftMin[i] = true; } else { left = i; } if(nums[nums.length - i - 1] < nums[right]) { hasRightMax[nums.length - i - 1] = true; } else { right = nums.length - i - 1; } } for(int i = 1 ; i < nums.length - 1 ; i++) { if(hasLeftMin[i] && hasRightMax[i]) return true; } return false; }
這種思路雖然遵循了O(N)的時(shí)間復(fù)雜度,但是違背了O(1)的空間復(fù)雜度
思路二:找到最小的兩個(gè)數(shù)字思路二是從討論區(qū)排名第一的回答中挖過來的。這個(gè)思路實(shí)在是非常的獨(dú)特,而且精煉!這里它用兩個(gè)變量分別記錄了已經(jīng)遍歷過的數(shù)字中最小的數(shù)字和第二小的數(shù)字,一旦找到比這兩個(gè)數(shù)字都大的數(shù)字就證明一定存在一個(gè)升序。
public boolean increasingTriplet(int[] nums) { int small = Integer.MAX_VALUE, big = Integer.MAX_VALUE; for(int n : nums) { if(n <= small) { small = n; } else if (n<=big) { big = n; } else { return true; } } return false; }
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72332.html
摘要:描述給定一個(gè)未排序的數(shù)組,判斷這個(gè)數(shù)組中是否存在長度為的遞增子序列。說明要求算法的時(shí)間復(fù)雜度為,空間復(fù)雜度為。示例輸入輸出示例輸入輸出思路聲明三個(gè)變量,,用于表示首先遍歷數(shù)組,找到第一對滿足的數(shù)。此時(shí)依然有但是,不影響判斷的邏輯。 Description Given an unsorted array return whether an increasing subsequence o...
摘要:如果右面能碰到一個(gè)數(shù)大于,說明必然存在一個(gè)遞增的三元組。復(fù)雜度空間時(shí)間測試代碼結(jié)果 Given an unsorted array return whether an increasing subsequence oflength 3 exists or not in the array. More specifically, if there exists i , j , k suc...
摘要:題目不要求連續(xù)的三個(gè)增長數(shù),所以只需要更新其中較小的兩個(gè)數(shù),并在第三個(gè)數(shù)滿足條件的情況下返回即可。 Problem Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array. Formally the function should:Re...
摘要:每天會(huì)折騰一道及以上題目,并將其解題思路記錄成文章,發(fā)布到和微信公眾號(hào)上。三匯總返回目錄在月日月日這半個(gè)月中,做了匯總了數(shù)組知識(shí)點(diǎn)。或者拉到本文最下面,添加的微信等會(huì)根據(jù)題解以及留言內(nèi)容,進(jìn)行補(bǔ)充,并添加上提供題解的小伙伴的昵稱和地址。 LeetCode 匯總 - 2019/08/15 Create by jsliang on 2019-08-12 19:39:34 Recently...
摘要:再用二分法找當(dāng)前值應(yīng)該在排好序的數(shù)組中的插入位置。因?yàn)橐业氖亲铋L的序列,所以每次將排好序的數(shù)組中替換成已經(jīng)排好序的,會(huì)能保證得到的結(jié)果是最長的。保證升序相等也要替換這個(gè)值 LeetCode[300] Longest Increasing Subsequence Given an unsorted array of integers, find the length of longe...
閱讀 3682·2021-11-23 09:51
閱讀 1045·2021-11-19 11:30
閱讀 3373·2019-08-29 14:16
閱讀 3379·2019-08-29 12:12
閱讀 2374·2019-08-26 13:40
閱讀 3489·2019-08-26 12:21
閱讀 3082·2019-08-26 11:55
閱讀 2230·2019-08-26 11:35