转载请注明出处:
http://blog.csdn.net/miaoyunzexiaobao
1. Two Sum
https://leetcode.com/problems/two-sum/
给定一个数组,在其中找两个数,使两个数之和为给定的target。返回这两个数在数组中的位置。两个数字的位置分别用index1和index2表示,要求index1<index2。例:
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
思路:
利用map的特性,其中map的(key,value)代表(target-num[i],i),即key表示数字num[i]到target的距离,value表示数字num[i]在数组中的位置。遍历num数组中的每个数,检测该数是否是map的key,若是则表明查找成功,否则将该数字存入map,继续查看下一个数。以题中给出的输入输出为例:
i为0时,map为空,numbers[0]=2,target-numbers[i] = 9 – 2 = 7,即对numbers[0]而言,还要加7才能达到target-9,将(7,0)加入map
i为1时,numbers[1]=7,map的key中包含该数字,查询成功。
查询到的两个数在numbers中的下标为{0,1}。由于index从1开始计算,因此返回{1,2}
C++:
vector<int> twoSum(vector<int> &numbers, int target) { <span style="white-space:pre"> </span>vector<int> result; int index1=0,index2=0; map<int,int> mInt; for(vector<int>::iterator iter =numbers.begin() ; iter != numbers.end() ; ++iter){ if(mInt.find(*iter) !=mInt.end()){ index1 =(mInt.find(*iter))->second + 1; index2 = iter -numbers.begin()+1; }else mInt.insert(make_pair(target- *iter,iter-numbers.begin())); } cout<<index1<<""<<index2<<endl; result.push_back(index1); result.push_back(index2); return result; }
JAVA:
public int[] twoSum(int[] numbers, int target) { int[] result = new int[2]; int index1 = 0, index2 = 0; Map<Integer, Integer> map = newHashMap<Integer, Integer>(); for (int i = 0; i < numbers.length;++i) { if (map.containsKey(numbers[i])){ index1 =map.get(numbers[i]) + 1; index2 = i + 1; break; } else map.put(target -numbers[i], i); } result[0] = index1; result[1] = index2; return result; }
2. Add Two Numbers
https://leetcode.com/problems/add-two-numbers/
给定两个以倒序形式存放在链表中的数,求两个数的和,并以倒序链表形式输出。例:
给定342和564,两个数的和为807。也就是输入(2 -> 4 -> 3) 和 (5 -> 6 -> 4),要求输出7 -> 0 -> 8:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7-> 0 -> 8
思路:
这题没什么难的,把两个链表中的每个数字依次相加,这一过程中注意某节点两数之和大于10时要在之后一个节点的两个数相加中加一即可。
C++:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { <span style="white-space:pre"> </span>ListNode *result = new ListNode(0); ListNode *cur = result; int count = 0; while(l1 != NULL || l2 != NULL){ int i = 0 , j = 0; if(l1 != NULL){ i = l1->val; l1 = l1->next; } if(l2 != NULL){ j = l2->val; l2 = l2->next; } int sum = i + j + count; cur->next = new ListNode(sum %10); cur = cur->next; count = sum / 10; } if(count != 0) cur->next = newListNode(count); return result->next; }
JAVA:
public ListNodeaddTwoNumbers(ListNode l1, ListNode l2) { <span style="white-space:pre"> </span>ListNode result = new ListNode(0); <span style="white-space:pre"> </span>ListNode cur = result; int count = 0; while (l1 != null || l2 != null) { int i = 0, j = 0; if (l1 != null) { i = l1.val; l1 = l1.next; } if (l2 != null) { j = l2.val; l2 = l2.next; } int sum = i + j + count; cur.next = new ListNode(sum %10); cur = cur.next; count = sum / 10; } if (count != 0) cur.next = new ListNode(count); return result.next; }
3. Longest Substring WithoutRepeating Characters
https://leetcode.com/problems/longest-substring-without-repeating-characters/
给定一个字符串,求最长不重复子序列长度。例:输入字符串”abcabcbb”,其最长不重复子序列是abc,返回2。输入字符串”bbbb”,其最长不重复子序列是b,返回1.
思路:
这题有点意思。可用两个指针,一个指向当前子串的头,一个指向尾,尾指针runner不断往后扫描,当有字符前面出现过了,记录当前子串长度和最优解的比较结果。之后尾指针runner暂时保持不动,移动头指针至下一个与尾指针不重复的地方,再继续移动尾指针runner,开始进行新一轮的不重复子串长度计算。即头指针walker不断往后扫描,直到扫描到一个字符和尾指runner针相同后加一,然后尾指针runner继续向后扫描。当尾指针runner到达字符串结尾,算法结束。复杂度O(n) + O(n) = O(n)。
以string s = “adbcabed”为例,在遇见第一个重复的a之前,其最大不重复子串长度为4.此时walker在s[0],runner在s[4],这一不重复子串长度为4.之后将walker移至d,即s[1]。将runner继续向后以后。当runner移动到第二个b,即s[5]时,再次出现重复,该子串长度为4.将walker移动至与b之后的字符,即c,也就是s[3],runner继续向后移动,直至末尾均无重复元素,此时runner指向s最后的元素d之后的位置,获得最大长度8 – 3 = 5;
C++:
int lengthOfLongestSubstring(string s) { int maxLength = 0; int walker = 0 , runner = 0; set<char> setChar; for(int i = 0 ; i < s.length() ; ++i){ if(setChar.find(s[i]) ==setChar.end()) setChar.insert(s[i]); else{ maxLength = (maxLength> runner - walker)?(maxLength):(runner - walker); while(s[walker] !=s[runner]){ setChar.erase(*setChar.find(s[walker])); ++walker; } ++walker; } ++runner; } maxLength = (maxLength > runner -walker)?(maxLength):(runner - walker); return maxLength; }
JAVA:
public int lengthOfLongestSubstring(String s) { <span style="white-space:pre"> </span>int maxLength = 0; int walker = 0, runner = 0; Set<Character> setChar = newHashSet<Character>(); for (int i = 0; i < s.length(); ++i){ if(!setChar.contains(s.charAt(i))) setChar.add(s.charAt(i)); else { maxLength =Math.max(maxLength, runner - walker); while (s.charAt(walker) !=s.charAt(runner)) { setChar.remove(s.charAt(walker)); ++walker; } ++walker; } ++runner; } maxLength = Math.max(maxLength, runner -walker); return maxLength; }
原文地址:http://blog.csdn.net/miaoyunzexiaobao/article/details/44928603