算法训练营学习打卡Day1

题目1、
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; }

总结

  • 遇到的困难:对数组和指针的运用还不够熟练,虽然是简单题,但是还是做得磕磕绊绊
  • 今日收获:对数组和指针的理解又加深了,加油!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值