力扣1818.绝对差值和
-
把nums1拷贝复制一份 去重排序 对于每个nums2都找到差距最小的那个数(二分)
- 作差求最大可优化差值
- 去重排序可以直接用set 自动去重排序了
-
const int N = 1e9+7; class Solution { public: int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) { long long cur = 0; //求当前差值和 set<long long> st; for(int i=0;i<nums1.size();i++) { cur += abs(nums1[i] - nums2[i]); st.insert(nums1[i]); } long long ret = cur; for(int i=0;i<nums2.size();i++) { //set的二分写法 直接调用 //找到>=nums2[i]的第一个数 auto ptr = st.lower_bound(nums2[i]); //如果没出界 if(ptr != st.end()) ret = min(ret,cur - (abs(nums1[i] - nums2[i]) - abs(nums2[i] - *ptr))); //如果前面还有一项小的 再比一次 if(ptr != st.begin()) { -- ptr; ret = min(ret,cur - (abs(nums1[i] - nums2[i]) - abs(nums2[i] - *ptr))); } } return ret%N; } };