aspnet网站开发到部署流程,无极网站建设定制,网站全程设计技术,珠宝玉器监测网站建设方案目录
410.分割数组的最大值
4.寻找两个正序数组的中位数
51.N皇后 410.分割数组的最大值 这个题可以运用二分答案的算法来解题。定义一个左指针和一个右指针#xff0c;令左指针等于数组的最大值#xff0c;令右指针等于数组所有数之和。即最终的结果一定在他们之间。
lo…目录410.分割数组的最大值4.寻找两个正序数组的中位数51.N皇后410.分割数组的最大值这个题可以运用二分答案的算法来解题。定义一个左指针和一个右指针令左指针等于数组的最大值令右指针等于数组所有数之和。即最终的结果一定在他们之间。long long l 0, r 0; for (int i 0; i nums.size(); i) { r nums[i]; if (l nums[i]) { l nums[i]; } }定义一个返回值ans。然后进行二分。long long ans0; while(lr) { long long mid(lr)/2; if(cheak(mid,nums,k)) { ansmid; rmid-1; } else { lmid1; } }这个题的cheak函数里面需要定义一个值ans初始为1和求和变量sum然后遍历数组进行求和当sum大于mid的时候那么ans就进行加一给sum重新赋值。最后进行判断ans与k的大小。bool cheak(long long mid,vectorint nums,int k) { long long sum0; int ans1; for(int i0;inums.size();i) { if(sumnums[i]mid) { ans; sumnums[i]; } else sumnums[i]; } return ansk; }完整代码class Solution { public: int splitArray(vectorint nums, int k) { long long l 0, r 0; for (int i 0; i nums.size(); i) { r nums[i]; if (l nums[i]) { l nums[i]; } } long long ans0; while(lr) { long long mid(lr)/2; if(cheak(mid,nums,k)) { ansmid; rmid-1; } else { lmid1; } } return ans; } bool cheak(long long mid,vectorint nums,int k) { long long sum0; int ans1; for(int i0;inums.size();i) { if(sumnums[i]mid) { ans; sumnums[i]; } else sumnums[i]; } return ansk; } };4.寻找两个正序数组的中位数这个题首先考虑数组是否为空。int n1 nums1.size(); int n2 nums2.size(); int n n1 n2; if (n1 0 || n2 0) { if (n1 0 n2 0) { return 0; } else if (n1 0) { if (n2 % 2 1) return nums2[n2 / 2]; else return (nums2[n2 / 2 - 1] nums2[n2 / 2]) / 2.0; } else { if (n1 % 2 1) return nums1[n1 / 2]; else return (nums1[n1 / 2 - 1] nums1[n1 / 2]) / 2.0; } }判断之后进行查找那个中位数。首先需要判断两个数组加起来的数是奇数还是偶数。如果是奇数只需要找一个n/21就可以了。偶数需要找n/21和n/2。else { if (n % 2 1) { return twocz(nums1, nums2, n / 2 1); } else { return (twocz(nums1, nums2, n / 2) twocz(nums1, nums2, n / 2 1)) / 2.0; } }进行查找首先我们要定义一个a和b指向两个数组的初始位置。设需要找的中位数位置为k。令num1[min(ak/2-1,num1.size()-1)]和num2[min(bk/2-1,num2.size()-1)]比较大小。小的那一个可以直接排除掉。所以k进去排除的部分。一直进行循环。直到anum1.size()或bnum2.size()或k1;返回相应的值。int twocz(vectorint nums1, vectorint nums2, int k) { int n nums1.size(); int m nums2.size(); int a 0; int b 0; while (1) { if (a n) { return nums2[b k - 1]; } if (b m) { return nums1[a k - 1]; } if (k 1) { return min(nums1[a], nums2[b]); } int c min(a k / 2 - 1, n - 1); int d min(b k / 2 - 1, m - 1); int j1 nums1[c]; int j2 nums2[d]; if (j1 j2) { k - c - a 1; a c 1; } else { k - d - b 1; b d 1; } } }完整代码int twocz(vectorint nums1, vectorint nums2, int k) { int n nums1.size(); int m nums2.size(); int a 0; int b 0; while (1) { if (a n) { return nums2[b k - 1]; } if (b m) { return nums1[a k - 1]; } if (k 1) { return min(nums1[a], nums2[b]); } int c min(a k / 2 - 1, n - 1); int d min(b k / 2 - 1, m - 1); int j1 nums1[c]; int j2 nums2[d]; if (j1 j2) { k - c - a 1; a c 1; } else { k - d - b 1; b d 1; } } } class Solution { public: double findMedianSortedArrays(vectorint nums1, vectorint nums2) { int n1 nums1.size(); int n2 nums2.size(); int n n1 n2; if (n1 0 || n2 0) { if (n1 0 n2 0) { return 0; } else if (n1 0) { if (n2 % 2 1) return nums2[n2 / 2]; else return (nums2[n2 / 2 - 1] nums2[n2 / 2]) / 2.0; } else { if (n1 % 2 1) return nums1[n1 / 2]; else return (nums1[n1 / 2 - 1] nums1[n1 / 2]) / 2.0; } } else { if (n % 2 1) { return twocz(nums1, nums2, n / 2 1); } else { return (twocz(nums1, nums2, n / 2) twocz(nums1, nums2, n / 2 1)) / 2.0; } } } };51.N皇后这个题运用了剪枝回溯法 定义三个bool变量分别判断列和两个对角线。之后与全排列相似。完整代码const int N10; bool f1[10],f2[NN],f3[NN],f4[NN]; void dfs(vectorvectorint z,int n,int x,vectorint arr) { if(xn) { z.push_back(arr); } for(int i1;in;i) { if(x1-i0) { if(!f1[i]!f2[x1-i]!f4[x1i]) { f1[i]true; f2[x1-i]true; f4[x1i]true; arr[x]i; dfs(z,n,x1,arr); f1[i]false; f2[x1-i]false; f4[x1i]false; } } else { if(!f1[i]!f3[i-x-1]!f4[x1i]) { f1[i]true; f3[i-x-1]true; f4[x1i]true; arr[x]i; dfs(z,n,x1,arr); f1[i]false; f3[i-x-1]false; f4[x1i]false; } } } } class Solution { public: vectorvectorstring solveNQueens(int n) { vectorvectorint z; vectorint arr; for(int i0;in;i) { arr.push_back(0); } dfs(z,n,0,arr); vectorvectorstring s; for(int i0;iz.size();i) { vectorstrings1; for(int j0;jn;j) { string s2; int az[i][j]; for(int z0;zn;z) { if(za-1) s2.push_back(Q); else s2.push_back(.); } s1.push_back(s2); } s.push_back(s1); } return s; } };