88. 合併兩個有序陣列
給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為乙個有序陣列。
說明:初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。
你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。
示例:輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]
審題
解題思路
建立兩個指標,從尾部開始比較,為什麼從尾部開始呢?
為了避免搬移陣列
搬移陣列是說,如果從小到大比較並移動元素的話,需要將元素向後串移
var
merge
=function
(nums1, m, nums2, n)
else}if
(m <
0&& n >=0)
}return nums1;
// 根據題意要合併nums2到nums1,返回nums1
};
let len = m + n;
// m+n是nums1的長度,而且這個就是上面的尾指標 ,但是用的時候要先--
while
(n >0)
// 誰大就把誰放在尾指標位置
nums1[
--len]
= nums1[m -1]
>= nums2[n -1]
? nums1[
--m]
: nums2[
--n];}
return nums1
給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。
示例 1:
輸入: [1,3,4,2,2]
輸出: 2
示例 2:
輸入: [3,1,3,4,2]
輸出: 3
說明:不能更改原陣列(假設陣列是唯讀的)。
只能使用額外的 o(1) 的空間。
時間複雜度小於 o(n2) 。
陣列中只有乙個重複的數字,但它可能不止重複出現一次。
var
findduplicate
=function
(nums)
)for
(let i =
0; i1; i++)}
return-1
};
var
findduplicate
=function
(nums)
//slow 從起點出發, fast 從相遇點出發, 一次走一步
slow =0;
while
(slow != fast)
return slow;
};
給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。
示例:輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:必須在原陣列上操作,不能拷貝額外的陣列。
儘量減少操作次數。
var
movezeroes
=function
(nums)
}return nums
};
給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:不能使用**庫中的排序函式來解決這道題。
示例:輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
高階:乙個直觀的解決方案是使用計數排序的兩趟掃瞄演算法。
首先,迭代計算出0、1 和 2 元素的個數,然後按照0、1、2的排序,重寫當前陣列。
你能想出乙個僅使用常數空間的一趟掃瞄演算法嗎?
思路
其實可以參照上一題,就是增加了乙個擋板而已
var
sortcolors
=function
(nums)
if(nums[index]==2
)}return nums
};
演算法 陣列連乘問題
乙個程度為n的陣列,現在要令 a 0 a 1 a 2 a n 1 a 1 a 0 a 2 a n 1 a 2 a 0 a 1 a n 1 a n 1 a 0 a 2 a n 2 條件是不能用除法,時間複雜度必須是線性。觀察一下題目,每乙個元素 i 都被更新成了a 0 到a n 1 除去 i 下標元素...
玩轉演算法 陣列問題
陣列問題 排序 選擇排序 插入排序 歸併排序 快速排序 查詢 二分查詢法 資料結構 棧 佇列 堆 如何寫出正確的程式 明確變數的含義 迴圈不變數 小資料量除錯 大資料量測試 leetcode 283.move zeros問題 給定乙個陣列nums,寫乙個函式,將函式中所有的0挪到陣列的末尾,而維持其...
簡單演算法 陣列
1.給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。param nums return var removeduplicates function nums prices return var maxprofit function prices pa...