力扣周赛第251期(下)

535 阅读2分钟

这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战

1946. 子字符串突变后可能得到的最大整数

截屏2021-08-14 下午9.52.43.png

思路分析

这道题需要我们替换字符串的一个数字,使数字尽可能的大。需要注意的是仅仅是一个数字,因此我们就从前往后遍历。

那么由于change[num]只有一个,也就是说只有一种突变可能,所以这个就是很简单的贪心算法

找到从左到右第一个突变后比原值大的数据。

1947. 最大兼容性评分和

截屏2021-08-14 下午10.25.47.png

思路分析

需要注意的是 ,本题对n的限制比较严格 1 <= m, n <= 8,这就给了我们穷举的机会,那么两对数组元素两两配对有多少种可能呢,这就比较难计算,不妨将一个数组固定,讨论另一个数组有几种排列方式(也就是一道简单的数组全排列问题,这个题答案很多,前人之述备矣

在全排列的基础上为其增加一个计算兼容性评分和的代码,和一个返回最大兼容性评分和的代码,就可以完成本题。

其中计算兼容性评分和就是在排列数组遍历到最后一位的时候简单的数组遍历即可。

返回最大兼容性评分和需要和原有的代码合在一起:

  for (int i = 0; i < n; i++) {
    if (mark[i] == false) {
        mark[i] = true;
        order.push_back(i);
        ret = max(ret, dfs(order, mark, s, m,n));
        order.pop_back();
        mark[i] = false;
    }
}

需要注意的是,mark[i]为true的意思是某一条路径(当我们将dfs理解为一颗树,一个从根结点到某叶子结点的线我们称为某一路径),已经具备了i节点。因此需要在popback后将mark[i]还原。