ARTS 计划第三周周

Algorithm:

3Sum Closest

Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example:

Given array nums = [-1, 2, 1, -4], and target = 1.

The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

Solution

class Solution {
public:
	int threeSumClosest(vector<int>& nums, int target) {
		std::sort(nums.begin(), nums.end());
		int sum = nums[nums.size() - 1] + nums[nums.size() - 2] + nums[nums.size() - 3];
		int adistance = abs(nums[nums.size() - 1] + nums[nums.size() - 2] + nums[nums.size() - 3]-target);
		int i = 0;
		if (nums.size() > 2) {
			for (i = 0; i < nums.size() - 2; i++)
			{
				int j = i + 1;
				int k = nums.size() - 1;

				while (k > j) {
					int tmp = nums[i] + nums[j] + nums[k];
					int compare = tmp - target;
					if (abs(compare) < adistance)
                    {sum = tmp;
						adistance = abs(compare);
                    }
					if (compare < 0)
					{
						j++;
					}
					else if (compare > 0)
					{
						k--;
					}
					else if(compare==0)
					{
						sum = tmp;
						return sum;
					}
				}
			}
		}
		return sum;
	}
};

和上一题的基本算法相似,不同在于需要判断三个数的和是否与目标值最接近,如果较小就更新结果。

Letter Combinations of a Phone Number

Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Solution

class Solution {
public:
	string NumChar[8];
	vector<string> result;
	void initial() {
		NumChar[0] = "abc";
		NumChar[1] = "def";
		NumChar[2] = "ghi";
		NumChar[3] = "jkl";
		NumChar[4] = "mno";
		NumChar[5] = "pqrs";
		NumChar[6] = "tuv";
		NumChar[7] = "wxyz";
	}
	void GetNumber(vector<string> &result, string answer, int remainsize, string digits)
	{
		if (remainsize == 0)
		{
			result.push_back(answer);
		}
		else if (remainsize > 0)
		{
			int num = digits.size() - remainsize;
			int index = NumChar[digits[num]-'2'].size();
			for (int i = 0; i < index; i++)
			{
				int remainsizecopy = remainsize;
				string answer_copy = answer;
				answer_copy += NumChar[digits[num]-'2'][i];
				remainsizecopy--;
				GetNumber(result, answer_copy, remainsizecopy, digits);
			}
		}
	}
	vector<string> letterCombinations(string digits) {
		initial();
        if(digits==""){
            return result;
        }
		string answer;
		GetNumber(result, answer, digits.size(), digits);
		return result;
	}
};

使用递归的算法:

  1. 将整个事情分为两部,第一部分为当前的按钮需要选区的值,第二部分为剩余的部分。
  2. 在剩余的部分继续使用步骤一,直至到最后一个。

REVIEW

Unix环境高级编程
1.open read write lseek pthread_t fork 这些函数的学习。
2.尝试写出多线程的冲突问题,没有找到,后来发现可能是虚拟机的单核,导致多线程没有出现冲突的情况

TIPS

一直迷茫在工作和学习的问题上,没有好好工作。没有什么可以记录的。

SHARE

[10 proven, most effective ways to use a to-do list]
(https://www.bountytasker.com/10-proven-most-effective-ways-to-use-a-to-do-list/)
高效的时间规划对我的启发。

  1. 通过尽可能的完成计划来作为一天的结束,这样第二天你就不会制定不合乎实际的计划了。
  2. 只需罗列5条重要的事情,过多的条目会让你不知道事情的重要性
  3. 给每个事情安排提供 一个时间段,可以提高实现事情的可能
  4. 通过给事情提供优先级来处理事情。
原文地址:https://www.cnblogs.com/bookdrip/p/10667881.html