leetcode 初級之數(shù)組篇 03

旋轉(zhuǎn)數(shù)組

給定一個數(shù)組,將數(shù)組中的元素向右移動 k 個位置,其中 k 是非負數(shù)。
示例 1:
輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉(zhuǎn) 1 步: [7,1,2,3,4,5,6]
向右旋轉(zhuǎn) 2 步: [6,7,1,2,3,4,5]
向右旋轉(zhuǎn) 3 步: [5,6,7,1,2,3,4]

方法一

// 性能較差勁
//void rotate(int* nums, int numsSize, int k) {
//    int tem = 0;
//    for (int i = 1; i <= k; i++) {
//        tem = nums[numsSize - 1];
//        for (int j = numsSize - 1; j >= 0; j--) {
//            nums[j] = nums[j - 1];
//        }
//        nums[0] = tem;
//    }
//}

方法二

// 執(zhí)行用時 4ms 高效算法
void reverse(int *arr, int start, int end) {
    int temp = 0;
    while (start < end) {
        temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

void rotate(int* nums, int numsSize, int k) {
    if (nums == NULL || numsSize == 0 || k % numsSize == 0) {
        return;
    }
    int kcount = k % numsSize;
    int middle = numsSize - kcount;
    reverse(nums, 0, middle - 1); // reverse left part
    reverse(nums, middle, numsSize - 1); // reverse right part
    reverse(nums, 0, numsSize - 1); // reverse whole part
}
int main(int argc, const char * argv[]) {
    @autoreleasepool {
     
        int arr[] = {1,2,3,4,5,6,7};
        rotate(arr, 7, 3);
        for (int i = 0; i < 7; i++) {
            printf("%d ",arr[i]);
        }
        printf("\n");
    }
    return 0;
}

這里有一個很巧妙的方法:

利用數(shù)組的length - k 把數(shù)組 分為兩半;

reverse 左邊和右邊的數(shù)組;

reverse 總數(shù)組。

舉一個例子:

1 2 3 4 5 6 7  如果k = 3 的話, 會變成 5 6 7 1 2 3 4

1 2 3 4 5 6 7  middle = 7 - 3 = 4,分為左邊 4個數(shù)字,右邊 3個數(shù)字

4 3 2 1 7 6 5  分別把左右reverse 一下

5 6 7 1 2 3 4  把總數(shù)組reverse 一下就會得到答案

參考文章:
http://www.cnblogs.com/grandyang/p/4298711.html
http://www.cnblogs.com/grandyang/p/4298711.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • [{"reportDate": "2018-01-23 23:28:49","fluctuateCause": n...
    加勒比海帶_4bbc閱讀 897評論 1 2
  • 這是我一直想要對老媽說的,也是今年最后一次放狠話。 有的時候,自己就是有退路,才會一而再再而三地放縱自我,才沒有想...
    海豚的世界閱讀 212評論 0 0
  • 孩子的背誦一直在我的指導(dǎo)下進行,并且我們也一直跟著老師和同學們的節(jié)奏,雖然不超前學習,但每次遇到背誦作業(yè),孩子...
    世話實說閱讀 11,456評論 1 11
  • 謙謙君子,似水柔情 他對她的愛是一半的無奈 我可以為我們的散承擔一半 可我偏要摧毀所有的好感 看上去能孤獨...
    三之道閱讀 876評論 0 0

友情鏈接更多精彩內(nèi)容