荷兰国旗算法仅使用“if”而不使用“else if or else”

问题描述 投票:0回答:1

作品:

vector<int> nums = {2,0,2,1,1,0};
int low = 0,mid = 0,high = nums.size() - 1;

        while(mid<=high){
            if(nums[mid]==0){
                swap(nums[mid],nums[low]);
                mid++;
                low++;
            }
            else if(nums[mid]==1){
                mid++;
            }
            else if(nums[mid]==2){
                swap(nums[mid],nums[high]);
                high--;
            }
        }

如果我只使用“if”3次,代码不起作用,但使用1次就可以了,为什么? 不起作用:

vector<int> nums = {2,0,2,1,1,0};
int low = 0,mid = 0,high = nums.size() - 1;

        while(mid<=high){
            if(nums[mid]==0){
                swap(nums[mid],nums[low]);
                mid++;
                low++;
            }
            if(nums[mid]==1){
                mid++;
            }
            if(nums[mid]==2){
                swap(nums[mid],nums[high]);
                high--;
            }
        }

我试图在leetcode上解决这种排序颜色问题,如果我只使用if语句它不起作用。

c++
1个回答
0
投票

你正在第一个身体内改变

mid
。在第一个版本中,您的三向分区排除其他分支,这等于:

    while(mid<=high){
        if(nums[mid]==0){
            swap(nums[mid],nums[low]);
            mid++;
            low++;
            continue;
        }
        if(nums[mid]==1){
            mid++;
            continue;
        }
        if(nums[mid]==2){
            swap(nums[mid],nums[high]);
            high--;
            continue;
        }
    }

在 C++ 中可以用更简洁的方式编写:

while(mid<=high)
switch(nums[mid]) {
case 0: swap(nums[mid++],nums[low++]); continue;
case 2: swap(nums[mid++],nums[high]); continue;
case 1: high--;
}
© www.soinside.com 2019 - 2024. All rights reserved.