leetcode给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
dummy
,因为删除某个结点得操作需要它得前驱,而第一个结点没有前驱,所以加入头结点会更方便,删除操作与其他结点统一。 ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* slow = dummy;
ListNode* fast = dummy;
n++;
while (n--) {
fast = fast->next;
}
while (fast) {
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
return dummy->next;
}
Leetcode给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
cur <= p2
而不是cur < nums.size()
因为p2之后的数都是交换过来的2,如果cur < nums.size()
会再次判断交换,顺序就变成了021的顺序。 void sortColors(vector<int>& nums) {
int p0 = 0, p2 = nums.size() - 1;
int cur = 0;
while (cur < p2) {
if (nums[cur] == 1) cur++;
else if (nums[cur] == 0) swap(nums[p0++], nums[cur++]);
else if (nums[cur] == 2) swap(nums[cur],nums[p2--]);
}
}
leetcode给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
cur = NULL
为结束,而数组是i = -1
和i = size()
为结束。 void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1, cur = m + n - 1;
while ( p1 >= 0 && p2 >= 0){
nums1[cur--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
}
if (p1 < 0) {
while (p2 >= 0)
nums1[cur--] = nums2[p2--];
}
}
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1, cur = n + m - 1;
while(cur >= 0){
if (p1 < 0) nums1[cur--] = nums2[p2--];
else if (p2 < 0) nums1[cur--] = nums1[p1--];
else nums1[cur--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
}
}
Leetcode给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0, right = numbers.size() - 1;
while (left < right) {
if (numbers[left] + numbers[right] == target){
return {left + 1, right + 1};
} else if (numbers[left] + numbers[right] < target) {
left++;
} else if (numbers[left] + numbers[right] > target) {
right--;
}
}
return {};
}
leetcode编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
bool isVolew(char ch){
if(ch=='a' || ch=='e'||ch=='i' || ch=='o'||ch=='u') return true;
if(ch=='A' || ch=='E'||ch=='I' || ch=='O'||ch=='U') return true;
return false;
}
string reverseVowels(string s) {
int left=0, right=s.size() - 1;
while (left < right) {
if (!isVolew(s[left])) ++left;
if (!isVolew(s[right])) --right;
if (isVolew(s[left]) && isVolew(s[right])) {
swap(s[left++], s[right--]);
}
}
return s;
}
leetcode给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。
输入:
s = "abpcplea", d = ["ale","apple","monkey","plea"]
输出:
"apple"
输入:
s = "abpcplea", d = ["a","b","c"]
输出:
"a"
string findLongestWord(string s, vector<string>& d) {
string longest = "";
for(int i = 0; i < d.size(); ++i){
if(d[i].size() < longest.size()) continue;
if(d[i].size() == longest.size() && longest.compare(d[i]) < 0) continue;
if(isSub(s, d[i])) longest = d[i];
}
return longest;
}
bool isSub(string s,string d){
int i=0, j=0;
while(i < s.size() && j < d.size()){
if(s[i] == d[j]){
i++;
j++;
}else{
i++;
}
}
return j == d.size();
}
Leetcode给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。
bool judgeSquareSum(int c) {
int left = 0;
long right = sqrt(c);
while (left <= right) {
int sum = left * left + right * right;
if (sum < c) {
left++;
} else if (sum > c) {
right--;
} else if (sum == c){
return true;
}
}
return false;
}
Leetcode给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
输入: "aaa"
输出: 6
说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".
int countSubstrings(string s) {
int cnt = 0;
for (int i = 0; s[i] != '\0'; ++i){
expand(s, i, i+1, cnt);
expand(s, i, i, cnt);
}
return cnt;
}
void expand(string s,int left,int right,int& cnt){
while (left >= 0 && right < s.size() && s[left] == s[right]){
left--;
right++;
cnt++;
}
}
Leetcode 给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
isPalindrome()
函数中不用从两头再重复遍历 bool validPalindrome(string s) {
int left = 0,right = s.size() - 1;
while (left < right) {
if (s[left] != s[right])
return isPalindrome(s, left + 1, right) || isPalindrome(s, left, right - 1);
left++; right--;
}
return true;
}
bool isPalindrome(string s,int left,int right){
while (left < right) {
if (s[left] != s[right]) return false;
left++;
right--;
}
return true;
}
leetcode 给你一个二进制字符串 s(仅由 '0' 和 '1' 组成的字符串)。 返回所有字符都为 1 的子字符串的数目。 由于答案可能很大,请你将它对 10^9 + 7 取模后返回。
输入:s = "0110111"
输出:9
解释:共有 9 个子字符串仅由 '1' 组成
"1" -> 5 次
"11" -> 3 次
"111" -> 1 次
right
指向1,而right+1
指向0,然后开始移动左子针,直到做指针指向第一个1停,至此形成一个窗口,处理结束后记得更新左指针。 int numSub(string s) {
int left = 0, right = 0;
long res = 0;
while (right + 1 <= s.size()) {
if (s[right] == '1' && s[right + 1] == '0' ||
s[right] == '1' && s[right + 1] == '\0') {
while (s[left] == '0') left++;
long len = right - left + 1;
res += (1 + len ) * len / 2;
res %= 1000000007;
left = right + 1;
}
right++;
}
return res;
}
1 + 2 + 3+...+n)
个子串,即连续1每当增加一个1就会多加len(1)个子串。 int numSub(string s) {
int res = 0, len = 0;
for (auto& ch : s) {
if (ch == '1') {
len++;
res += len;
res %= 1000000007;
} else {
len = 0;
}
}
return res;
}
vector<int> sortedSquares(vector<int>& A) {
for (int i = 0; i < A.size(); ++i) {
A[i] *= A[i];
}
sort(A.begin(), A.end());
return A;
}
vector<int> sortedSquares(vector<int>& A) {
int neg = 0;
for (int i = 1; i < A.size(); ++i) {
if ((A[i - 1] < 0 && A[i] > 0) || A[i] == 0) {
neg = i;
break;
}
}
vector<int> res;
int left = neg - 1, right = neg;
while (left >= 0 || right < A.size()) {
if (left < 0) {
res.push_back(pow(A[right++], 2));
continue;
}
if (right == A.size()) {
res.push_back(pow(A[left--], 2));
continue;
}
res.push_back(pow(A[left], 2) <= pow(A[right], 2) ? pow(A[left--], 2) : pow(A[right++], 2));
}
return res;
}
leetcode 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
int maxArea(vector<int>& height) {
int MAX = INT_MIN;
for (int i = 0; i < height.size(); ++i) {
for (int j = i + 1; j < height.size(); ++j) {
MAX = max(MAX, min(height[i], height[j]) * (j - i));
}
}
return MAX;
}
int maxArea(vector<int>& height) {
int MAX = INT_MIN;
int left = 0, right = height.size() - 1;
while (left < right) {
int h = min(height[left], height[right]);
MAX = max(MAX, h * (right - left));
if (height[left] < height[right]) ++left;
else --right;
}
return MAX;
}
leetcode 给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。 让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组: A.length >= 3 在 0 < i < A.length - 1 条件下,存在 i 使得: A[0] < A[1] < ... A[i-1] < A[i] A[i] > A[i+1] > ... > A[A.length - 1]
bool validMountainArray(vector<int>& A) {
if (A.size() < 3) return false;
int idx = 0;
for (int i = 1; i < A.size(); ++i) {
if (A[i] < A[i - 1]) {
idx = i - 1;
break;
}
}
if (idx == 0) return false;
for (int i = idx; i + 1 < A.size(); ++i) {
if (A[i] <= A[i + 1]) {
return false;
}
}
return true;
}
bool validMountainArray(vector<int>& A) {
if (A.size() < 3) return false;
int left = 0, right = A.size() - 1;
while (left + 1 < A.size() && A[left] < A[left + 1]) left++;
while (right > 0 && A[right] < A[right - 1]) right--;
if (left == right && left != 0 && right != A.size() - 1) return true;
return false;
}
leetcode 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
void nextPermutation(vector<int>& nums) {
if (nums.empty() || nums.size() == 1) return;
int i = nums.size() - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i < 0) {
sort(nums.begin(), nums.end());
return;
}
int j = nums.size() - 1;
while (j > i && nums[j] <= nums[i]) {
j--;
}
swap(nums[i], nums[j]);
reverse(nums.begin() + i + 1, nums.end());
}
leetcode 给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。 你可以返回任何满足上述条件的数组作为答案。
vector<int> sortArrayByParityII(vector<int>& A) {
vector<int> res(A.size(), 0);
int oddIdx = 1;
int evenIdx = 0;
for (auto num : A) {
if (num & 1) {
res[oddIdx] = num;
oddIdx += 2;
} else {
res[evenIdx] = num;
evenIdx += 2;
}
}
return res;
}
leetcode 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。
输入:nums = [1,3,4,2,2]
输出:2
int findDuplicate(vector<int>& nums) {
int fast = 0, slow = 0;
do {
fast = nums[nums[fast]];
slow = nums[slow];
} while (fast != slow);
fast = 0;
while (fast != slow) {
fast = nums[fast];
slow = nums[slow];
}
return slow;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。