ARTS 计划第二周周

Algorithm:

15. 3Sum

Given an array nums of n integers, are there elements a, b, c in nums such that a > + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

class Solution {
public:
	vector<vector<int>> threeSum(vector<int>& nums) {
		vector<vector<int>> result;
		std::sort(nums.begin(), nums.end());
		if (nums.size() > 2) {
			if (nums[0] == 0 && nums[nums.size() - 1] == 0) {
				result.push_back({ 0,0,0 });
			}
			else {
				for (int i = 0; i < nums.size() - 2; i++)
				{
					int j = i + 1;
					int k = nums.size() - 1;
					while (k > j)
					{
						int sum = nums[i] + nums[j] + nums[k];
						if (sum == 0)
						{
							vector<int> tmp;
							tmp.push_back(nums[i]);
							tmp.push_back(nums[j++]);
							tmp.push_back(nums[k--]);
							result.push_back(tmp);
						}
						else if (sum < 0) {
							j++;
						}
						else if (sum > 0) {
							k--;
						}
					}
				}
			}
			std::sort(result.begin(), result.end());
			result.erase(std::unique(result.begin(), result.end()), result.end());
		}
		return result;
	}
};

自己一开始做的时候没有很好的把握问题的逻辑,看完一个人的java代码,确实十分的巧妙,通过排序好的一组数,设置三个指针,分别代表三个数,分别从前和从后扫描。还没有看过算法导论,感觉很像动态规划的感觉。这个代码和上次一样,出现了空集没有处理的问题。

REVIEW

Developing Your Intuition For Math
这篇文章着重的描述了对于数学学习的正确的方法——需要从数学的起源学起,这样你才能够了解这抽象的数学符号下有趣的事情和丰富的含义,以及他应该要去解决的问题。从起源也就是数学的周边来学习数学表达式的一些本质和应用,而不是单单只是一些学习的步骤。文中很形象的一个解释就是从 “cat”到“DNA”,而不是直接去了解“DNA”这样你对数学永远也不会有一个直观的认识

Tips

在最近的工作中,遇到的最大的问题就是代码量大了之后,自己对于程序代码的管理和规划问题,存在了相当大的问题。查找了一些代码规范的书籍,给自己罗列了以下几点来进行参考

对于控制流的处理

  • 先处理正逻辑,在处理负逻辑
  • 先处理简单逻辑,在处理复杂逻辑
  • 减少逻辑的嵌套(1.通过线性逻辑来处理,2.提早返回结果(错误处理))
  • 通过德摩根定理来简化逻辑

变量删减

  • 减少冗余变量(不曾用到的,或实际可以去掉的)
  • 缩小变量作用域(只在用到的作用域附近定义变量而不全都为全局变量)
  • 将一个大类拆分成多个小类

减小函数

  • 确保函数一次只做一件事

SHARE

《数字图像处理》冈萨雷斯,通过这本书的学习,以及通过Matlab实现书中的基本章节知识,可以算基本入门了早期的图像处理的内容。

posted @ 2019-03-31 23:18  bookdrip  阅读(132)  评论(0编辑  收藏  举报