日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】581. 最短无序连续子数组(Java、数组)

發布時間:2024/7/23 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】581. 最短无序连续子数组(Java、数组) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 && 代碼
      • 1. 排序法 O(nlogn)、O(n)
      • 2. 記錄 max[ ]、min[ ] 的寫法 O(n)、O(n)
      • 3. 記錄 max、min 的寫法 O(n)、O(1)
      • 二刷

打卡第十五天~
前兩天有事斷簽了,要繼續加油噢!

題目描述

  • 主要是,需要達到 O(n) 復雜度。

思路 && 代碼

1. 排序法 O(nlogn)、O(n)

  • 誒,讓我先來一個懶狗寫法
  • 先 Arrays.sort 排序,然后有序數組、原數組逐個對比,找到需要進行排序的子數組頭、尾元素即可。
class Solution {public int findUnsortedSubarray(int[] nums) {int len = nums.length;int[] copyArray = Arrays.copyOf(nums, len);// 時間復雜度 O(nlogn)Arrays.sort(copyArray);int left = 0;for(; left < len; left++) {if(nums[left] != copyArray[left]) {break;}}int right = len - 1;for(; right >= left; right--) {if(nums[right] != copyArray[right]) {break;}}return right - left + 1;} }

2. 記錄 max[ ]、min[ ] 的寫法 O(n)、O(n)

  • 這個思路是,之前寫的接雨水,用到的思路,這里剛好套用下。
  • min[i]:記錄 i 右邊的最小元素。如果 i 比這個元素大,說明 i 需要重排。
  • max[i]:記錄 i 左邊的最大元素。如果 i 比這個元素小,說明 i 需要重排。
    (實際代碼復用 min數組)
class Solution {public int findUnsortedSubarray(int[] nums) {int len = nums.length;int[] min = new int[len];// 1. 先找 left// 尾元素右邊沒有值,直接設為自己min[len - 1] = nums[len - 1];for(int i = len - 2; i >= 0; i--) {min[i] = Math.min(nums[i + 1], min[i + 1]);}int left = len - 1;for(int i = 0; i < len; i++) {if(min[i] < nums[i]) {left = i;break;}}if(left == len - 1) {return 0;}// 2. 再找 right;min[0] = nums[0];for(int i = 1; i < len; i++) {min[i] = Math.max(nums[i - 1], min[i - 1]);}int right = 0;for(int i = len - 1; i >= 0; i--) {if(min[i] > nums[i]) {right = i;break;}}return right - left + 1;} }

3. 記錄 max、min 的寫法 O(n)、O(1)

  • 算是方法2的優化吧,空間復雜度只有 O(1)
  • 總體思路一樣,這里是沒有 break
  • max:記錄 i 左邊的最大元素,如果 i 更小,說明 i 需要調整
  • min:記錄 i 右邊的最大元素,如果 i 更大,說明 i 需要調整
class Solution {public int findUnsortedSubarray(int[] nums) {int len = nums.length;if(len <= 1) {return 0;}// 1. 從左往右,記錄最大值。如果 nums[i] < max,說明 i 需要調整int left = -1;int max = nums[0];for(int i = 1; i < len; i++) {max = Math.max(max, nums[i]);if(nums[i] < max) {left = i;}}// 2. 從右往左,記錄最小值,同理int right = 0;int min = nums[len - 1];for(int i = len - 2; i >= 0; i--) {min = Math.min(min, nums[i]);if(nums[i] > min) {right = i;}}// left == -1 則說明整體有序,不用排序return left == -1 ? 0 : left - right + 1;} }

二刷

  • 接雨水的思路= =,都快忘了已經
class Solution {public int findUnsortedSubarray(int[] nums) {// 從左往右,記錄最大值,不斷調整。max 記錄左邊的最大值int max = nums[0];int right = -1;for(int i = 1; i < nums.length; i++) {max = Math.max(max, nums[i]);// 此時的 nums[i] 比左邊的最大值小,德不配位!先保留著(后面可能還有更德不配位的)if(nums[i] < max) {right = i; }}// 找 left,同理int min = nums[nums.length - 1];int left = nums.length;for(int i = nums.length - 1; i >= 0; i--) {min = Math.min(min, nums[i]);if(nums[i] > min) {left = i; }}return right == -1 ? 0 : right - left + 1;} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】581. 最短无序连续子数组(Java、数组)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。