LeetCode-旋轉陣列
將包含 n 個元素的陣列向右旋轉 k 步。
例如,如果 n = 7 , k = 3,給定陣列 [1,2,3,4,5,6,7]
,向右旋轉後的結果為 [5,6,7,1,2,3,4]
。
注意:
儘可能找到更多的解決方案,這裡最少有三種不同的方法解決這個問題。
感覺這個題目還是可以的。
首先要明白什麼是一維陣列向右旋轉幾步(當然肯定會有對應向左旋轉幾步嘍,說不定也有向上或者向下旋轉啦,呵呵自己google了),你以為是像上學時候那樣軍訓時原地旋轉嗎?其實我在很久以前剛觸到的時候就是這麼想的,我厲害吧。
碼子可以說明一切:
- [1,2,3,4,5,6,7]//初始陣列
- //向右旋轉1步
- [7,1,2,3,4,5,6]//向右旋轉1步之後的陣列
- //再向右旋轉1步,相對一最開始的陣列就是向右旋轉2步
- [6,7,1,2,3,4,5]//向右旋轉2步之後的陣列
- //把最原始的陣列向左旋轉1步
- [2,3,4,5,6,7,1]//這就是向左旋轉一步之後的陣列
應該看明白了吧,就拿向右旋轉1步來說:首先向拿旋轉的陣列要有一個初始的陣列,是相對於一個數組來說向左或者向右的;向右旋轉1步就是說把初始陣列的最高位上的數字放置在陣列的最低位置,讓後其他位置上的數字都把自身的位置提高1位。就這麼簡單什麼向左旋轉都一個道理(程式設計師都愛說一些高大上的名詞。聽起來很牛逼,說穿了哎。。。)
其實這就很容易想到第一種方案:
- privatestaticint[] Rotate2(int[] nums,
- {
- int length = nums.Length;
- while (k > 0)//迴圈幾次就看k是多少
- {
- int t = 0;
- t = nums[length - 1];//這是獲取陣列最高位置上的數字
- for (int j = length - 2; j >= 0; j--)//從倒數第二個數字開始,倒敘迴圈。迴圈主要目的就是把其他數字位置都擡高一位
- {
- nums[j + 1] = nums[j];
- }
- nums[0] = t;//擡高玩其他的,就可以直接把最高位上的數字賦值到0號位上了
- k--;//完成一個迴圈
- }
- returnnull;
- }
其實上面每一次迴圈就三步:第一獲取最高位的數字,第二把其他位上的數字都擡高一位,第三把最初獲得最高位的數字賦值到最低位置上。
第二種方法就比較取巧了:
- privatestaticint[] Rotate1(int[] nums, int k)
- {
- int[] result = newint[nums.Length];//根據nums陣列長度生成和其一樣長度的陣列
- for (int i = 0; i < nums.Length; i++)
- {
- result[(i + k) % nums.Length] = nums[i];//這裡用到了取餘,也是這個方法的核心
- }
- return result;
- }
為什麼用取餘上個例子:
- ///3元素在陣列中的2位置上,(2+3) % 7 = 5
- ///5元素在陣列中的4位置上,(4+3) % 7 = 0
- ///6元素在陣列中的5位置上,(5+3) % 7 = 1
- ///7元素在陣列中的6位置上,(6+3) % 7 = 2
長度為7的陣列,向右旋轉3步,數字的位置加3之後大於7的都要再從0號位置重新開始計算剩餘的步子。這點特性就可以很好的用到求餘。
應用一下:
- staticint[] nums = newint[] { 1, 2, 3, 4, 5, 6, 7 };
- staticvoid Main(string[] args)
- {
- //Rotate1(nums, 3);
- Rotate2(nums, 3);
- }
這種型別的題目還有很多種解法(自己可以google嘍),以後願意的話我再補充。
用四種方法實現了將陣列元素迴圈右移k個位置,相關的解釋作為註釋放在程式碼裡面了。
- package movearrayelement;
- import java.util.BitSet;
- publicclass MoveArrayElement {
- /**
- * 每次把陣列中所有元素移動一個位置,移動k輪
- * @param array
- * @param k
- */
- publicstaticvoid moveArrayElement(int[] array, int k) {
- int length = array.length;
- // 右移newk + n * length個位置,和右移newk個位置效果是一樣的
- int newk = k % length;
- int temp = 0;
- for(int i = 0; i < newk; i++) {
- temp = array[length - 1];
- for(int j = length - 2; j >= 0; j--) {
- array[j+1]=array[j];
- }
- array[0]=temp;
- }
- }
- /**
- * 開闢一個新陣列,把舊陣列中的元素直接放在新陣列中正確的位置
- * @param array
- * @param k
- * @return
- */
- publicstaticint[] moveArrayElement1(int[] array, int k) {
- int length = array.length;
- // 右移newk + n * length個位置,和右移newk個位置效果是一樣的
- int newk = k % length;
- int[] newArray = newint[length];
- // 重複length次把元素從舊位置移到新位置
- for(int i = 0; i < length; i++) {
- // 求出元素新的位置
- int newPosition = (i + newk) % length;
- newArray[newPosition] = array[i];
- }
- return newArray;
- }
- /**
- * 1.把一個元素放在一個正確的位置,再把被佔位置的元素放到它應該在的正確的位置,一直
- * 重複下去,直到陣列的所有元素都放在了正確的位置;
- * 2.但是必須考慮環形的情況,比如十個元素的陣列,右移5個位置,這時,位置0的元素應該放在位置5,
- * 位置5的元素應該放在位置0,這樣,完全通過1的迭代就不能得到 正確的結果
- * @param array
- * @param k
- */
- publicstaticvoid moveArrayElement2(int[] array, int k) {
- int length = array.length;
- BitSet bitSet = new BitSet(length);
- boolean flag = false;
- // 保證最多隻移動count=length次位置
- int count = 0;
- for(int j = 0; j < length; j++) {
- if (flag) {
- break;
- }
- if (!bitSet.get(j)) {
- // 右移newk + n * length個位置,和右移newk個位置效果是一樣的
- int newk = k % length;
- // 舊位置
- int oldPosition = j;
- // 儲存舊位置的值
- int oldValue = array[oldPosition];
- // 臨時值
- int temp = 0;
- // 重複length次把元素從舊位置移到新位置
- for(int i = 0; i < length; i++) {
- // 求出元素新的位置
- int newPosition = (oldPosition + newk) % length;
- // 如果新位置已經放置了對得值,就不要往新位置再次放入值了
- if (bitSet.get(newPosition)) {
- break;
- }
- // 臨時儲存新位置(也就是新的舊位置)的值
- temp = array[newPosition];
- // 移動元素到新位置
- array[newPosition] = oldValue;
-
相關推薦
Leetcode 旋轉陣列(c++)
給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,6] 向右旋轉 2 步: [6,7,1,2,3
leetcode---旋轉陣列
題目說明 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右
LeetCode-旋轉陣列
旋轉陣列將包含 n 個元素的陣列向右旋轉 k 步。例如,如果 n = 7 , k = 3,給定陣列 [1,2,3,4,5,6,7] ,向右旋轉後的結果為 [5,6,7,1,2,3,4]。注意:儘可能找到更多的解決方案,這裡最少有三種不同的方法解決這個問題。感覺這個題目
LeetCode——旋轉陣列
問題描述:給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。解法一:將下標為i的元素放在下標i+k處,再將下標i+k處的元素放置在正確位置,以此類推(AC),時間複雜度:O(n),空間複雜度:O(1),程式碼如下:private static void R
(LeetCode)旋轉陣列
原體描述如下: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotate
Leetcode演算法——33、查詢有序旋轉陣列
給定一個數組,這個陣列是由一個升序陣列進行左旋或右旋若干次得到的。 比如,[0,1,2,4,5,6,7] 可能會變為 [4,5,6,7,0,1,2] 給定一個目標值,去陣列中查詢這個值。如果找到,則返回索引,否則返回-1。 可以假設陣列中沒有重複值。 示例: Exampl
LeetCode演算法題189:旋轉陣列解析
給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,6] 向右旋轉 2 步: [6,7,1,2,3,4,5]
LeetCode 189.Rotate Array (旋轉陣列)
題目描述: 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,
LeetCode 189.旋轉陣列
void rotate(int* nums, int numsSize, int k) { int i,j,b; for (i = 0; i < k; i++) { b=nums[numsSize-1]; for (j = numsSize-2; j >= 0; j
刷爆LeetCode之旋轉陣列
旋轉陣列 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7]和 k = 3輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,6] 向右旋轉 2 步: [6
LeetCode使用Python實現旋轉陣列
需求: 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,6] 向右旋轉 2 步: [6,7,1,
LeetCode[189].旋轉陣列
題目 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,6] 向右旋轉 2 步
LeetCode之旋轉陣列
給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1
【leetcode】#陣列【Python】48. Rotate Image 旋轉影象
連結: 題目: 給定一個 n × n 的二維矩陣表示一個影象。 將影象順時針旋轉 90 度。 說明: 你必須在原地旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉影象。 示
【LeetCode-面試演算法經典-Java實現】【153-Find Minimum in Rotated Sorted Array(找旋轉陣列中的最小數字)】
原題 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0
LeetCode--初級演算法--陣列篇-旋轉陣列
題目 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,1,2,3,4,5,6] 向右旋轉 2 步: [6,7,
LeetCode-探索-初級-陣列-旋轉陣列-java
旋轉陣列 給定一個數組,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。 示例 1: 輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉 1 步: [7,
LeetCode 153. Find Minimum in Rotated Sorted Array(旋轉陣列查詢)
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find t
LeetCode(初級演算法)陣列篇---旋轉陣列
題目 將包含 n 個元素的陣列向右旋轉 k 步。 例如,如果 n = 7 , k = 3,給定陣列 [1,2,3,4,5,6,7] ,向右旋轉後的結果為 [5,6,7,1,2,3,4]。 注意: 儘可能找到更多的解決方案,這裡最少有三種不同的方法
【LeetCode】Rotate Array 旋轉陣列
題目 Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7]