【算法】使数组有序的最小交换次数

  • 相关参考:
    • 数组排序 使得交换次数最少
      ,该文章中代码出现了一处错误,看起来作者好像很长时间没有更新了,在此纠正下。
    • TsReaper-6235. 逐层排序二叉树所需的最少操作数目,参考该题解的评论区的作者解答,进行纠正。
  • 贪心思想,每一步使得对应元素放到它该放的位置。
    • 先将要排序的数组复制一份,然后将其排序,使用哈希表记录排序后的数组对应元素与其对应下标。
    • 遍历原数组与排序后的数组,如果对应下标不相等,则根据哈希表记录该元素的下标进行交换。
int getMinSwap(vector &nums)
{
    mapmp;    
    vectorsort_nums(nums);
    sort(sort_nums.begin(),sort_nums.end());
    for (int i = 0; i 
  • 注意上述代码中,第二个for循环使用的是while,使用if会跳过某些元素。如下图对比。
  • 使用if

【算法】使数组有序的最小交换次数_第1张图片

  • 使用while

【算法】使数组有序的最小交换次数_第2张图片

  • 相关题目
    • 6235. 逐层排序二叉树所需的最少操作数目
  • 先层序遍历获取每层元素,然后对每层元素求有序最小的操作数目。
int minimumOperations(TreeNode* root) {
        int depth = 0;
        vector>layerContent;
        queueque;
        if(root)que.push(root);
        while(!que.empty()){
            int size = que.size();
            depth++;
            vectortmp;
            for(int i =  0; i < size;i++){
                TreeNode* node = que.front();
                que.pop();
                tmp.push_back(node->val);
                if(node->left)que.push(node->left);
                if(node->right)que.push(node->right);
            }
            layerContent.push_back(tmp);
        }
        // 已经获取二叉树的每层元素&层数
        int count = 0;
        for(int i = 1; i < depth;i++){
            count += getMinSwap(layerContent[i]);
        }
        return count;
}

你可能感兴趣的:(数据结构与算法,算法,leetcode,数据结构)