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]右回転2ステップ:[6,7,1,2,3,4,5]右回転3ステップ:[5,6,7,1,2,3,4]例2:入力:[-1,-100,3,99,99,-1,-100]およびk=2出力:[3,99,-1,-100]解釈:右回転1ステップ:[99,-1,3]右回転2ステップ:[3,99,-1,100]説明:
  • 思想:(1)例1:[1,2,3,4,5,6,7]->[7,6,5,4,3,2,1]->[5,6,7,4,3,2,1]->[5,6,7,1,2,3,4],配列を二重ポインタの方法で全体的に逆置きした後,前のk個の要素を逆置きし,最後に残りの要素を逆置きした.
    //        O(n), 92%
    void rotate(int* nums, int numsSize, int k) {
        k = k%numsSize;
        int temp=0;
        int i=0, j=numsSize-1;
        while(i < j){
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            i++;
            j--;
        }
        i = 0;
        j = k-1;
        while(i < j){
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            i++;
            j--;
        } 
        i = k;
        j = numsSize-1;
        while(i < j){
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            i++;
            j--;
        }   
    }
    

    (2)余分な空間(非その場)を用いて,後k個の要素をそのまま新しい配列にコピーし,前の要素をそのまま新しい配列にコピーする.