classSolution { public: intsubarraySum(vector<int>& nums, int k){ int length = nums.size(); int count = 0; for (int i = 0; i < length; ++i) { int sum = 0; for (int j = i; j < length; ++j) { sum += nums[j]; if (sum == k) ++count; } } return count; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { publicintsubarraySum(int[] nums, int k) { intlength= nums.length; intcount=0; for (inti=0; i < length; ++i) { intsum=0; for (intj= i; j < length; ++j) { sum += nums[j]; if (sum == k) ++count; } } return count; } }
1 2 3 4 5 6 7 8 9 10
classSolution: defsubarraySum(self, nums: List[int], k: int) -> int: length = len(nums) count = 0 for i inrange(length): sum = 0 for j inrange(i, length): sum += nums[j] if (sum == k): count += 1 return count
2. 哈希表
遍历时记录所有和并放入哈希表,寻找子串时只寻找当前值与目标值的差,相同值通过哈希表的值来记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: intsubarraySum(vector<int>& nums, int k){ unordered_map<int, int> hashMap; hashMap[0] = 1; // 相同值需要 int sum = 0; int count = 0; for (auto& num : nums) { sum += num; if (hashMap.count(sum - k)) count += hashMap[sum - k]; ++hashMap[sum]; } return count; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { publicintsubarraySum(int[] nums, int k) { Map<Integer, Integer> hashMap = newHashMap<>(); hashMap.put(0, 1); intsum=0; intcount=0; for (int num : nums) { sum += num; if (hashMap.containsKey(sum - k)) count += hashMap.get(sum - k); hashMap.put(sum, hashMap.getOrDefault(sum, 0) + 1); } return count; } }
1 2 3 4 5 6 7 8 9 10
classSolution: defsubarraySum(self, nums: List[int], k: int) -> int: hashMap = {0 : 1} sum = 0 count = 0 for num in nums: sum += num if (sum - k in hashMap): count += hashMap[sum - k] hashMap[sum] = hashMap.get(sum, 0) + 1 return count
二:最大子数组和
1. 动态规划
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { public: intmaxSubArray(vector<int>& nums){ int next = 0; int result = nums[0]; for (auto& num : nums) { next = max(next + num, num); // 局部最优 result = max(result, next); } return result; } };
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { publicintmaxSubArray(int[] nums) { intnext=0; intresult= nums[0]; for (int num : nums) { next = Math.max(next + num, num); // 局部最优 result = Math.max(result, next); } return result; } }
1 2 3 4 5 6 7 8
classSolution: defmaxSubArray(self, nums: List[int]) -> int: next = 0 result = nums[0] for num in nums: next = max(next + num, num) result = max(result, next) return result
classSolution: defmerge(self, intervals: List[List[int]]) -> List[List[int]]: intervals.sort(key=lambda x: x[0]) result = [] for interval in intervals: ifnot result or result[-1][1] < interval[0]: result.append(interval) else: result[-1][1] = max(result[-1][1], interval[1]) return result
四:轮转数组
1. 额外数组
使用一个额外数组来存储移动后的元素
1 2 3 4 5 6 7 8 9 10 11
classSolution { public: voidrotate(vector<int>& nums, int k){ vector<int> newNums(nums.size()); for (int i = 0; i < nums.size(); ++i) { newNums[(i + k) % nums.size()] = nums[i]; } return nums.assign(newNums.begin(), newNums.end()); } };
classSolution { public: voidrotate(vector<int>& nums, int k){ int length = nums.size(); k = k % length; int step = gcd(k, length); // 最大公约数,得出需要的环 for (int i = 0; i < step; ++i) { int cur = i; int curV = nums[i]; do { cur = (cur + k) % length; swap(nums[cur], curV); } while(i != cur); } } };