LC.1200 | 最小绝对差 | 数组 | std::sort

最小绝对差算法解析

输入:一个整数数组 arr,其中每个元素都不相同。

要求:找到所有具有最小绝对差的元素对,并按升序顺序返回。

输出:所有满足条件的元素对 [a, b],其中 a < b 且 b - a 等于数组的最小绝对差。

思路:先排序数组,遍历相邻元素计算差值,维护最小差并收集对应元素对。

复杂度:时间复杂度 O(n log n),空间复杂度 O(1)(不计结果存储)。

class Solution {
public:
    vector<vector<int>> minimumAbsDifference(vector<int>& arr) {
        vector<vector<int>> ans;
        sort(arr.begin(), arr.end());
        int mindiff = INT_MAX;
        int n = arr.size();
        for (int i = 1; i < n; i++) {
            if (arr[i] - arr[i - 1] < mindiff) {
                ans.clear();
                mindiff = arr[i] - arr[i - 1];
                ans.push_back({arr[i -1], arr[i]});
            }
            else if (arr[i] - arr[i - 1] == mindiff) {
                ans.push_back({arr[i -1], arr[i]});
            }
        }
        return ans;
    }
};
### 关于 C++ 编译错误和警告的解决方案 在使用 C++ 开发时,遇到诸如 `'L'未声明`、`Illegal byte sequence` 和 `无法转换const wchar_t*到const TCHAR*` 等编译错误或警告是非常常见的现象。以下是这些问题的根本原因及其解决方法。 --- #### 1. **'L'未声明** 此问题通常是由于代码中存在孤立的字母 `L` 导致的。在 C++ 中,`L` 是宽字符前缀,用于标识宽字符串(如 `L"string"`)。如果单独使用了 `L` 而没有上下文支持,则会出现此类错误。 ##### 解决方案 - 检查代码中是否有孤立的 `L` 出现,并将其替换为正确的表达式。 - 如果需要定义宽字符串,请确保其格式正确,例如: ```cpp const wchar_t* str = L"这是一个宽字符串"; ``` --- #### 2. **Illegal byte sequence** 此错误通常发生在处理多字节字符集(MBCS)或 UTF-8 字符串时,尤其是在 Linux 或 macOS 上使用 GNU GCC 编译器的情况下。原因是某些字符序列不符合目标编码的要求。 ##### 解决方案 - 确保源文件保存为 UTF-8 编码格式,并启用 BOM(Byte Order Mark),以便编译器能够识别文件编码[^3]。 - 设置区域化信息以匹配操作系统默认的语言环境。可以在程序开头添加以下代码: ```cpp #include <locale> std::setlocale(LC_ALL, "zh_CN.UTF-8"); // 对应中文UTF-8环境 ``` - 避免直接混用不同类型的字符串(如 `char*` 和 `wchar_t*`),建议统一使用宽字符或窄字符。 --- #### 3. **无法转换 `const wchar_t*` 到 `const TCHAR*`** 这是因为在 Windows 平台上,`TCHAR` 的具体类型取决于 `_UNICODE` 宏是否已定义。如果没有定义 `_UNICODE`,则 `TCHAR` 默认为 `char`;反之,它将是 `wchar_t`[^1]。 ##### 解决方案 - 明确指定是否要使用 Unicode 支持。通过在项目设置中定义 `_UNICODE` 和 `UNICODE` 宏,或者在代码顶部手动定义它们: ```cpp #define _UNICODE #define UNICODE #include <tchar.h> // 提供对 TCHAR 的支持 ``` - 如果需要兼容两种模式,可以使用 `_T()` 或 `TEXT()` 宏来自动适配字符串类型。例如: ```cpp const TCHAR* text = _T("Hello, World!"); // 自动选择 char 或 wchar_t ``` --- #### 4. **未使用的变量警告** 这类警告表明某些局部变量已被声明但从未被访问过。虽然不会阻止程序运行,但在大型项目中可能导致维护困难。 ##### 解决方案 - 删除无意义的变量声明,仅保留实际需要的变量。 - 如果希望暂时忽略特定变量而不删除,可以通过显式注释说明其用途,或者简单赋值给自身以消除警告: ```cpp int unusedVariable = 0; (void)unusedVariable; // 告诉编译器该变量有意未使用 ``` --- ### 示例代码 以下是一个综合示例,展示如何正确处理宽字符与窄字符之间的转换以及避免常见错误: ```cpp #define _UNICODE #define UNICODE #include <iostream> #include <iomanip> #include <locale> #include <tchar.h> int main() { // 设置本地化环境 std::setlocale(LC_ALL, "zh_CN.UTF-8"); // 使用宽字符输出 const wchar_t* wideStr = L"你好,世界!"; std::wcout << wideStr << std::endl; // 兼容窄字符和宽字符 const TCHAR* tCharStr = _T("跨平台字符串"); #ifdef UNICODE std::wcout << tCharStr << std::endl; #else std::cout << tCharStr << std::endl; #endif // 处理未使用的变量 int ignoredVar = 42; (void)ignoredVar; return 0; } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值