704. 二分查找
数组理论基础
文章链接:代码随想录
代码如下:
int search(int* nums, int numsSize, int target) {
//注释是第一次自己写的,但是不知道哪里错了
/*int len = sizeof(nums) / sizeof(int);
int min = 0;
int mix = len - 1;
while(min < max)
{
if(nums[mid] > target)
{
max = mid - 1;
}
if(nums[mid] < target)
{
min = mid + 1;
}
if(nums[mid] == target)
{
return mid;
}
else
{
return -1;
}
}*/
int min = 0;
int max = numsSize - 1;
int mid;
while(min <= max){
mid = min + (max - min) / 2;
if (nums[mid] == target){
return mid;
}
else if (nums[mid] > target){
max = mid - 1;
}
else{
min = mid + 1;
}
}
return -1; // 如果没有找到目标值,则返回-1
}
下面附我觉得别人的比较好的双指针解法,个人的双指针学的还不是很好,毕竟还是第一天学指针ww
class Solution: def search(self, nums: List[int], target: int) -> int: left = 0 right = len(nums)-1
while left <= right:
mid = int(left + (right - left)/2)
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1 return -1
作者:温暖 链接:https://leetcode.cn/problems/binary-search/solutions/1852042/by-dxy-5n-ckjb/
int removeElement(int* nums, int numsSize, int val) {
题目2、
27. 移除元素
解法 #双指针:
//定义一个慢指针
int left = 0;
//再定义一个快指针
for(int right = 0;right < numsSize;right++)
{
if(nums[right] != val)
{
nums[left] = nums[right];
left++;
}
}
return left;
}
题目3、
977.有序数组的平方
下面是我用Python尝试的题解
class Solution(object):
def sortedSquares(self, nums):
""" :type nums: List[int] :rtype: List[int] """
#先写思路:首先每个数的绝对值会决定每个数平方后再数组中的排序
#先创建一个用于存储的列表
lst = [ ]
n = len(nums)
for i in range(0,n):
#把数组中的元素变为绝对值
nums[i] = abs(nums[i])
nums[i] = nums[i] ** 2
lst.append(nums[i])
return lst.sort()
但是结果报错了,debug提示“for i in range(0,n):”出了问题
接着我参考了别人的解法:
#Python # 直接排序:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted(num * num for num in nums)
# 双指针
class Solution: def sortedSquares(self, nums: List[int]) -> List[int]: n = len(nums) ans = [0] * n # 从两端开始遍历, 找到平方最大元素放到数组末尾 i, j, pos = 0, n - 1, n - 1
while i <= j:
if nums[i] * nums[i] > nums[j] * nums[j]:
ans[pos] = nums[i] * nums[i] i += 1
else:
ans[pos] = nums[j] * nums[j]
j -= 1
pos -= 1
return ans
作者:孤柒「一起学计算机」 链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solutions/1099698/si-wei-dao-tu-zheng-li-liang-chong-shuan-e3iz/
接着是C#的解法
/** * Note: The returned array must be malloced, assume caller calls free(). */ int* sortedSquares(int* nums, int numsSize, int* returnSize) {
//使用了双循环的思路
for(int i = 0;i < numsSize;i++)
{ //先遍历数组中的元素
nums[i] = nums[i] * nums[i];
}
//把元素平方,然后再把下一个数平方
//比较连个平方后的数的大小,然后判断是否交换数值
for (int i = 0;i < numsSize - 1;i++)
{
// i到最后只需要遍历到倒数第二个元素,实现倒数第二、倒数第一个元素的比较
for (int j = i + 1;j < numsSize;j++)
{ if (nums[i] < nums[j]){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } } return nums; }
代码加以修改后:
#include <stdlib.h>
int* sortedSquares(int* nums, int numsSize, int* returnSize)
{
// 分配一个新的数组来存储平方后的有序结果
int* result = (int*)malloc(numsSize * sizeof(int));
if (result == NULL)
{ *returnSize = 0;
// 如果内存分配失败,则返回空数组
return NULL;
}
// 初始化双指针 int left = 0, right = numsSize - 1, idx = numsSize - 1;
// 遍历直到左指针超过右指针
while (left <= right)
{
// 计算左右指针指向的数的平方
int leftSquare = nums[left] * nums[left];
int rightSquare = nums[right] * nums[right];
// 将较大的平方值放入结果数组的末尾,并移动相应的指针
if (leftSquare > rightSquare)
{ result[idx--] = leftSquare; left++; }
else
{ result[idx--] = rightSquare; right--; }
}
// 设置返回数组的大小 *returnSize = numsSize; // 返回结果数组 return result; }
总结
- 遇到的困难:对数组和指针的运用还不够熟练,虽然是简单题,但是还是做得磕磕绊绊
- 今日收获:对数组和指针的理解又加深了,加油!